Rmpfr/0000755000175000017500000000000014136524074011500 5ustar nileshnileshRmpfr/demo/0000755000175000017500000000000014136173460012423 5ustar nileshnileshRmpfr/demo/00Index0000644000175000017500000000006411764511504013554 0ustar nileshnileshhjkMpfr Hooke-Jeeves Minimization working for MPFR Rmpfr/demo/hjkMpfr.R0000644000175000017500000000601611764511504014151 0ustar nileshnilesh## some platforms hit zero exactly on the first step: ## if so the estimated precision is 2/3. cyq.f <- function (x) { rv <- cyq.res(x) ## mm <- length(rv) ## f <- 0 ## for (ii in 1:mm) f <- f+rv[ii]*rv[ii] ## f <- sum(rv*rv) f <- crossprod(rv) } cyq200.f <- function (xx) { rv <- cyq200.res(xx) ## mm <- length(rv) ## f <- 0 ## for (ii in 1:mm) f <- f+rv[ii]*rv[ii] ## f <- sum(rv*rv) ## f <- crossprod(rv) f <- sum(rv*rv) } cyq.res <- function (x) { ## Fletcher's chebyquad function m = n -- residuals n <- length(x) res <- rep(0,n) ## res <- mpfrArray(rep(0,n), 200, dim=n) # initialize for (i in 1:n) { ## loop over resids rr <- 0 for (k in 1:n) { z7 <- 1 z2 <- 2*x[k]-1 z8 <- z2 j <- 1 while (j= 4.2.3), mpfr (>= 3.0.0), pdfcrop (part of TexLive) is required to rebuild the vignettes. SystemRequirementsNote: 'MPFR' (MP Floating-Point Reliable Library, https://www.mpfr.org/) and 'GMP' (GNU Multiple Precision library, https://gmplib.org/), see >> README.md Depends: gmp (>= 0.6-1), R (>= 3.5.0) Imports: stats, utils, methods Suggests: MASS, Bessel, polynom, sfsmisc (>= 1.0-20), Matrix SuggestsNote: MASS, polynom, sfsmisc: only for vignette; Matrix: test-tools Enhances: dfoptim, pracma EnhancesNote: mentioned in Rd xrefs URL: https://rmpfr.r-forge.r-project.org/ BugReports: https://r-forge.r-project.org/tracker/?group_id=386 License: GPL (>= 2) Encoding: UTF-8 NeedsCompilation: yes Packaged: 2021-10-27 06:53:27 UTC; maechler Author: Martin Maechler [aut, cre] (), Richard M. Heiberger [ctb] (formatHex(), *Bin, *Dec), John C. Nash [ctb] (hjkMpfr(), origin of unirootR()), Hans W. Borchers [ctb] (optimizeR(*, "GoldenRatio"); origin of hjkMpfr()) Maintainer: Martin Maechler Repository: CRAN Date/Publication: 2021-10-28 13:40:12 UTC Rmpfr/README.md0000644000175000017500000000264013735036657012772 0ustar nileshnilesh# Installation and Reference of the R package 'Rmpfr' Installation is non-trivial if you install from __source_ because of the `SystemRequirements` (listed in `./DESCRIPTION`): ## The package Rmpfr interfaces R to the C Library MPFR: __MPFR, the "Multiple Precision Floating-Point Reliably" library__ which is Free/Libre Software, available under the LGPL license. [MPFR Website](https://www.mpfr.org/) ## MPFR itself is built on and requires the GMP library __GNU Multiple Precision arithmetic library (GMP)__ Obtain that from [GMP Website](https://gmplib.org/) or from your operating system vendor / package system: + Under _Debian_, _Ubuntu_ (and other Debian derivative) Linux distributions, it is sufficient (for *both* libraries) to simply do ```sh sudo apt-get install libmpfr-dev ``` + In Fedora, Redhat, CentOS, opensuse, etc, you get these via ```sh sudo dnf install mpfr-devel ``` ## The standard reference to MPFR is ```bibtex @article{FouLHLPZ-2007, author = {Laurent Fousse and Guillaume Hanrot and Vincent Lef\`{e}vre and Patrick P\'{e}lissier and Paul Zimmermann}, title = {MPFR: A multiple-precision binary floating-point library with correct rounding}, year = {2007}, journal = {ACM Trans. Math. Softw.}, volume = {33}, number = {2}, issn = {0098-3500}, pages = {13}, doi = {http://doi.acm.org/10.1145/1236463.1236468}, publisher = {ACM}, address = {New York, NY, USA}, } ``` Rmpfr/man/0000755000175000017500000000000014136173460012252 5ustar nileshnileshRmpfr/man/Bernoulli.Rd0000644000175000017500000000327013735036657014510 0ustar nileshnilesh\name{Bernoulli} \alias{Bernoulli} \title{Bernoulli Numbers in Arbitrary Precision} \description{ Computes the Bernoulli numbers in the desired (binary) precision. The computation happens via the \code{\link{zeta}} function and the formula \deqn{B_k = -k \zeta(1 - k),} and hence the only non-zero odd Bernoulli number is \eqn{B_1 = +1/2}. (Another tradition defines it, equally sensibly, as \eqn{-1/2}.) } \usage{ Bernoulli(k, precBits = 128) } \arguments{ \item{k}{non-negative integer vector} \item{precBits}{the precision in \emph{bits} desired.} } \value{ an \code{\linkS4class{mpfr}} class vector of the same length as \code{k}, with i-th component the \code{k[i]}-th Bernoulli number. } \references{\url{https://en.wikipedia.org/wiki/Bernoulli_number} } \author{Martin Maechler} \seealso{\code{\link{zeta}} is used to compute them. The next version of package \CRANpkg{gmp} is to contain %\code{\link[gmp]{BernoulliQ}()} \code{BernoulliQ()}, providing exact Bernoulli numbers as big rationals (class \code{"bigq"}). } \examples{ \dontshow{sessionInfo() .libPaths() packageDescription("gmp")} Bernoulli(0:10) plot(as.numeric(Bernoulli(0:15)), type = "h") curve(-x*zeta(1-x), -.2, 15.03, n=300, main = expression(-x \%.\% zeta(1-x))) legend("top", paste(c("even","odd "), "Bernoulli numbers"), pch=c(1,3), col=2, pt.cex=2, inset=1/64) abline(h=0,v=0, lty=3, col="gray") k <- 0:15; k[1] <- 1e-4 points(k, -k*zeta(1-k), col=2, cex=2, pch=1+2*(k\%\%2)) ## They pretty much explode for larger k : k2 <- 2*(1:120) plot(k2, abs(as.numeric(Bernoulli(k2))), log = "y") title("Bernoulli numbers exponential growth") Bernoulli(10000)# - 9.0494239636 * 10^27677 } \keyword{arith} Rmpfr/man/mpfr.Rd0000644000175000017500000001337413735036657013527 0ustar nileshnilesh\name{mpfr} \title{Create "mpfr" Numbers (Objects)} \alias{mpfr} \alias{is.mpfr} \alias{mpfr.default} \alias{mpfr.mpfr}% and more \alias{Const} \description{ Create multiple (i.e. typically \emph{high}) precision numbers, to be used in arithmetic and mathematical computations with \R. } \usage{ mpfr(x, precBits, \dots) \S3method{mpfr}{default}(x, precBits, base = 10, rnd.mode = c("N","D","U","Z","A"), scientific = NA, \dots) Const(name = c("pi", "gamma", "catalan", "log2"), prec = 120L, rnd.mode = c("N","D","U","Z","A")) is.mpfr(x) } \arguments{ \item{x}{a \code{\link{numeric}}, \code{\linkS4class{mpfr}}, \code{\link[gmp]{bigz}}, \code{\link[gmp]{bigq}}, or \code{\link{character}} vector or \code{\link{array}}.} \item{precBits, prec}{a number, the maximal precision to be used, in \bold{\emph{bits}}; i.e. \code{53} corresponds to double precision. Must be at least 2. If \code{\link{missing}}, \code{\link{getPrec}(x)} determines a default precision.} \item{base}{(only when \code{x} is \code{\link{character}}) the base with respect to which \code{x[i]} represent numbers; \code{base} \eqn{b} must fulfill \eqn{2 \le b \le 62}{2 <= b <= 62}.} \item{rnd.mode}{a 1-letter string specifying how \emph{rounding} should happen at C-level conversion to MPFR, see details.} \item{scientific}{(used only when \code{x} is the result of \code{\link{formatBin}()}, i.e., of class \code{"Bcharacter"}:) logical indicating that the binary representation of \code{x} is in scientific notation. When \code{TRUE}, \code{mpfr()} will substitute \code{0} for \code{_}; when \code{NA}, \code{mpfr()} will guess, and use \code{TRUE} when finding a \code{"p"} in \code{x}; see also \code{\link{formatBin}}.} \item{name}{a string specifying the mpfrlib - internal constant computation. \code{"gamma"} is Euler's gamma \eqn{(\gamma)}{}, and \code{"catalan"} Catalan's constant.} \item{\dots}{potentially further arguments passed to and from methods.} } \value{ an object of (S4) class \code{\linkS4class{mpfr}}, or for \code{mpfr(x)} when \code{x} is an array, \code{\linkS4class{mpfrMatrix}}, or \code{\linkS4class{mpfrArray}} which the user should just as a normal numeric vector or array. \code{is.mpfr()} returns \code{TRUE} or \code{FALSE}. } \details{ The \code{"\linkS4class{mpfr}"} method of \code{mpfr()} is a simple wrapper around \code{\link{roundMpfr}()}. MPFR supports the following rounding modes, %% the following is +- cut & paste from the MPFR manual \describe{ \item{GMP_RND\bold{N}:}{round to \bold{n}earest (roundTiesToEven in IEEE 754-2008).} \item{GMP_RND\bold{Z}:}{round toward \bold{z}ero (roundTowardZero in IEEE 754-2008).} \item{GMP_RND\bold{U}:}{round toward plus infinity (\dQuote{Up}, roundTowardPositive in IEEE 754-2008).} \item{GMP_RND\bold{D}:}{round toward minus infinity (\dQuote{Down}, roundTowardNegative in IEEE 754-2008).} \item{GMP_RND\bold{A}:}{round \bold{a}way from zero (new since MPFR 3.0.0).} } The \sQuote{round to nearest} (\code{"N"}) mode, the default here, works as in the IEEE 754 standard: in case the number to be rounded lies exactly in the middle of two representable numbers, it is rounded to the one with the least significant bit set to zero. For example, the number 5/2, which is represented by (10.1) in binary, is rounded to (10.0)=2 with a precision of two bits, and not to (11.0)=3. This rule avoids the "drift" phenomenon mentioned by Knuth in volume 2 of The Art of Computer Programming (Section 4.2.2). When \code{x} is \code{\link{character}}, \code{mpfr()} will detect the precision of the input object. %% FIXME examples } \references{ The MPFR team. (201x). \emph{GNU MPFR -- The Multiple Precision Floating-Point Reliable Library}; see \url{https://www.mpfr.org/mpfr-current/#doc} or directly \url{https://www.mpfr.org/mpfr-current/mpfr.pdf}. } \author{Martin Maechler} \seealso{The class documentation \code{\linkS4class{mpfr}} contains more details. Use \code{\link{asNumeric}} to transform back to double precision ("\code{\link{numeric}}"). } \examples{ mpfr(pi, 120) ## the double-precision pi "translated" to 120-bit precision pi. <- Const("pi", prec = 260) # pi "computed" to correct 260-bit precision pi. # nicely prints 80 digits [260 * log10(2) ~= 78.3 ~ 80] Const("gamma", 128L) # 0.5772... Const("catalan", 128L) # 0.9159... x <- mpfr(0:7, 100)/7 # a more precise version of k/7, k=0,..,7 x 1 / x ## character input : mpfr("2.718281828459045235360287471352662497757") - exp(mpfr(1, 150)) ## ~= -4 * 10^-40 ## Also works for NA, NaN, ... : cx <- c("1234567890123456", 345, "NA", "NaN", "Inf", "-Inf") mpfr(cx) ## with some 'base' choices : print(mpfr("111.1111", base=2)) * 2^4 mpfr("af21.01020300a0b0c", base=16) ## 68 bit prec. 44833.00393694653820642 mpfr("ugi0", base = 32) == 10^6 ## TRUE ## --- Large integers from package 'gmp': Z <- as.bigz(7)^(1:200) head(Z, 40) ## mfpr(Z) by default chooses the correct *maximal* default precision: mZ. <- mpfr(Z) ## more efficiently chooses precision individually m.Z <- mpfr(Z, precBits = frexpZ(Z)$exp) ## the precBits chosen are large enough to keep full precision: stopifnot(identical(cZ <- as.character(Z), as(mZ.,"character")), identical(cZ, as(m.Z,"character"))) ## compare mpfr-arithmetic with exact rational one: stopifnot(all.equal(mpfr(as.bigq(355,113), 99), mpfr(355, 99) / 113, tol = 2^-98)) ## look at different "rounding modes": sapply(c("N", "D","U","Z","A"), function(RND) mpfr(c(-1,1)/5, 20, rnd.mode = RND), simplify=FALSE) symnum(sapply(c("N", "D","U","Z","A"), function(RND) mpfr(0.2, prec = 5:15, rnd.mode = RND) < 0.2 )) } \keyword{classes} Rmpfr/man/base-copies.Rd0000644000175000017500000000070113325623111014721 0ustar nileshnilesh\name{Rmpfr-workarounds} \alias{outer} \title{Base Functions etc, as an Rmpfr version} \description{ Functions from \pkg{base} etc which need a \emph{copy} in the \pkg{Rmpfr} namespace so they correctly dispatch. } \usage{ outer(X, Y, FUN = "*", ...) } \arguments{ \item{X, Y, FUN, ...}{See \pkg{base} package help: \code{\link[base]{outer}}.} } \seealso{ \code{\link[base]{outer}}. } \examples{ outer(1/mpfr(1:10, 70), 0:2) } \keyword{misc} Rmpfr/man/mpfrMatrix-utils.Rd0000644000175000017500000000415612330435565016037 0ustar nileshnilesh\name{mpfrMatrix-utils} %\alias{det}% "the function" (our copy of base::det) \alias{determinant.mpfrMatrix} % \title{Functions for mpfrMatrix Objects} \description{ \code{determinant(x, ..)} computes the determinant of the mpfr square matrix \code{x}. May work via coercion to \code{"numeric"}, i.e., compute \code{determinant(\link{asNumeric}(x), logarithm)}, if \code{asNumeric} is true, by default, if the dimension is larger than three. Otherwise, use precision \code{precBits} for the \dQuote{accumulator} of the result, and use the recursive mathematical definition of the determinant (with computational complexity \eqn{n!}, where \eqn{n} is the matrix dimension, i.e., \bold{very} inefficient for all but small matrices!) } \usage{ \S3method{determinant}{mpfrMatrix}(x, logarithm = TRUE, asNumeric = (d[1] > 3), precBits = max(.getPrec(x)), \dots) } \arguments{ \item{x}{an \code{\linkS4class{mpfrMatrix}} object of \emph{square} dimension.} \item{logarithm}{logical indicating if the \code{\link{log}} of the absolute determinant should be returned. } \item{asNumeric}{logical .. .. if rather \code{determinant(\link{asNumeric}(x), ...)} should be computed. } \item{precBits}{the number of binary digits for the result (and the intermediate accumulations).} \item{\dots}{unused (potentially further arguments passed to methods).} } \value{ as \code{\link{determinant}()}, an object of S3 class \code{"det"}, a \code{\link{list}} with components \item{modulus}{the (logarithm of) the absolute value (\code{\link{abs}}) of the determinant of \code{x}.} \item{sign}{the sign of the determinant.} } %% \details{ %% } %% \references{ %% } \seealso{ \code{\link{determinant}} in base \R, which relies on a fast LU decomposition. \code{\linkS4class{mpfrMatrix}} } \author{Martin Maechler} \examples{ m6 <- mpfrArray(1:6, prec=128, dim = c(2L, 3L)) m6 S2 <- m6[,-3] # 2 x 2 S3 <- rbind(m6, c(1:2,10)) det(S2) str(determinant(S2)) det(S3) stopifnot(all.equal(det(S2), det(asNumeric(S2)), tolerance=1e-15), all.equal(det(S3), det(asNumeric(S3)), tolerance=1e-15)) } \keyword{array} Rmpfr/man/roundMpfr.Rd0000644000175000017500000000234112561376373014525 0ustar nileshnilesh\name{roundMpfr} \title{Rounding to Binary bits, "mpfr-internally"} \alias{roundMpfr} \alias{setPrec}% <- so its found \description{Rounding to binary bits, not decimal digits. Closer to the number representation, this also allows to \emph{increase} or decrease a number's precBits. In other words, it acts as \code{setPrec()}, see \code{\link{getPrec}()}. } \usage{ roundMpfr(x, precBits, rnd.mode = c("N","D","U","Z","A")) } \arguments{ \item{x}{an mpfr number (vector)} \item{precBits}{integer specifying the desired precision in bits.} \item{rnd.mode}{a 1-letter string specifying how \emph{rounding} should happen at C-level conversion to MPFR, see \code{\link{mpfr}}.} } % \details{ % } \value{an mpfr number as \code{x} but with the new 'precBits' precision} \seealso{ The \code{\linkS4class{mpfr}} class group method \code{Math2} implements a method for \code{\link{round}(x, digits)} which rounds to \emph{decimal} digits. } \examples{ (p1 <- Const("pi", 100)) # 100 bit prec roundMpfr(p1, 120) # 20 bits more, but "random noise" Const("pi", 120) # same "precision", but really precise \dontshow{ stopifnot(120 == getPrec(roundMpfr(p1, 120)), 75 == getPrec(roundMpfr(p1, 75))) } } \keyword{arith} Rmpfr/man/integrateR.Rd0000644000175000017500000001232712402301607014640 0ustar nileshnilesh\name{integrateR} \title{One-Dimensional Numerical Integration - in pure R} \alias{integrateR} \alias{print.integrateR} \alias{show,integrateR-method} \description{ Numerical integration of one-dimensional functions in pure \R, with care so it also works for \code{"mpfr"}-numbers. Currently, only classical Romberg integration of order \code{ord} is available. } \usage{ integrateR(f, lower, upper, \dots, ord = NULL, rel.tol = .Machine$double.eps^0.25, abs.tol = rel.tol, max.ord = 19, verbose = FALSE) } \arguments{ \item{f}{an \R function taking a numeric or \code{"mpfr"} first argument and returning a numeric (or \code{"mpfr"}) vector of the same length. Returning a non-finite element will generate an error. } \item{lower, upper}{the limits of integration. Currently \emph{must} be finite. Do use \code{"mpfr"}-numbers to get higher than double precision, see the examples.} \item{\dots}{additional arguments to be passed to \code{f}.} \item{ord}{integer, the order of Romberg integration to be used. If this is \code{NULL}, as per default, and either \code{rel.tol} or \code{abs.tol} are specified, the order is increased until convergence.} \item{rel.tol}{relative accuracy requested. The default is 1.2e-4, about 4 digits only, see the Note.} \item{abs.tol}{absolute accuracy requested.} \item{max.ord}{only used, when neither \code{ord} or one of \code{rel.tol}, \code{abs.tol} are specified: Stop Romberg iterations after the order reaches \code{max.ord}; may prevent infinite loops or memory explosion.} \item{verbose}{logical or integer, indicating if and how much information should be printed during computation.} } \details{ Note that arguments after \code{\dots} must be matched exactly. For convergence, \emph{both} relative and absolute changes must be smaller than \code{rel.tol} and \code{abs.tol}, respectively. \code{rel.tol} cannot be less than \code{max(50*.Machine$double.eps, 0.5e-28)} if \code{abs.tol <= 0}. } \note{ \code{f} must accept a vector of inputs and produce a vector of function evaluations at those points. The \code{\link{Vectorize}} function may be helpful to convert \code{f} to this form. If you want to use higher accuracy, you \emph{must} set \code{lower} or \code{upper} to \code{"\link{mpfr}"} numbers (and typically lower the relative tolerance, \code{rel.tol}), see also the examples. Note that the default tolerances (\code{rel.tol}, \code{abs.tol}) are not very accurate, but the same as for \code{\link{integrate}}, which however often returns considerably more accurate results than requested. This is typically \emph{not} the case for \code{integrateR()}. } \value{ A list of class \code{"integrateR"} (as from standard \R's \code{\link{integrate}()}) with a \code{\link{print}} method and components \item{value}{the final estimate of the integral.} \item{abs.error}{estimate of the modulus of the absolute error.} \item{subdivisions}{for Romberg, the number of function evaluations.} \item{message}{\code{"OK"} or a character string giving the error message.} \item{call}{the matched call.} } \references{ Bauer, F.L. (1961) Algorithm 60 -- Romberg Integration, \emph{Communications of the ACM} \bold{4}(6), p.255. } \author{Martin Maechler} \seealso{ \R's standard, \code{\link{integrate}}, is much more adaptive, also allowing infinite integration boundaries, and typically considerably faster for a given accuracy. } \note{ We use practically the same \code{print} S3 method as \code{\link{print.integrate}}, provided by \R,% 'stats' package with a difference when the \code{message} component is not \code{"Ok"}. } \examples{ ## See more from ?integrate ## this is in the region where integrate() can get problems: integrateR(dnorm,0,2000) integrateR(dnorm,0,2000, rel.tol=1e-15) (Id <- integrateR(dnorm,0,2000, rel.tol=1e-15, verbose=TRUE)) Id$value == 0.5 # exactly ## Demonstrating that 'subdivisions' is correct: Exp <- function(x) { .N <<- .N+ length(x); exp(x) } .N <- 0; str(integrateR(Exp, 0,1, rel.tol=1e-10), digits=15); .N ### Using high-precision functions ----- ## Polynomials are very nice: integrateR(function(x) (x-2)^4 - 3*(x-3)^2, 0, 5, verbose=TRUE) # n= 1, 2^n= 2 | I = 46.04, abs.err = 98.9583 # n= 2, 2^n= 4 | I = 20, abs.err = 26.0417 # n= 3, 2^n= 8 | I = 20, abs.err = 7.10543e-15 ## 20 with absolute error < 7.1e-15 ## Now, using higher accuracy: I <- integrateR(function(x) (x-2)^4 - 3*(x-3)^2, 0, mpfr(5,128), rel.tol = 1e-20, verbose=TRUE) I ; I$value ## all fine ## with floats: integrateR(exp, 0 , 1, rel.tol=1e-15, verbose=TRUE) ## with "mpfr": (I <- integrateR(exp, mpfr(0,200), 1, rel.tol=1e-25, verbose=TRUE)) (I.true <- exp(mpfr(1, 200)) - 1) ## true absolute error: stopifnot(print(as.numeric(I.true - I$value)) < 4e-25) ## Want absolute tolerance check only (=> set 'rel.tol' very high, e.g. 1): (Ia <- integrateR(exp, mpfr(0,200), 1, abs.tol = 1e-6, rel.tol=1, verbose=TRUE)) ## Set 'ord' (but no '*.tol') --> Using 'ord'; no convergence checking (I <- integrateR(exp, mpfr(0,200), 1, ord = 13, verbose=TRUE)) } \keyword{math} \keyword{utilities} Rmpfr/man/Mnumber-class.Rd0000644000175000017500000000344511764636731015270 0ustar nileshnilesh\name{Mnumber-class} \Rdversion{1.1} \docType{class} \alias{Mnumber-class} \alias{mNumber-class} \alias{numericVector-class} \title{Class "Mnumber" and "mNumber" of "mpfr" and regular numbers and arrays from them} \description{ Classes \code{"Mnumber"} \code{"mNumber"} are class unions of \code{"\linkS4class{mpfr}"} and regular numbers and arrays from them.\cr Its purpose is for method dispatch, notably defining a \code{cbind(...)} method where \code{...} contains objects of one of the member classes of \code{"Mnumber"}. Classes \code{"mNumber"} is considerably smaller is it does \emph{not} contain \code{"matrix"} and \code{"array"} since these also extend \code{"character"} which is not really desirable for generalized numbers. It extends the simple \code{"numericVector"} class by \code{mpfr*} classes. } \section{Methods}{ \describe{ \item{\%*\%}{\code{signature(x = "mpfrMatrix", y = "Mnumber")}: ... } \item{crossprod}{\code{signature(x = "mpfr", y = "Mnumber")}: ... } \item{tcrossprod}{\code{signature(x = "Mnumber", y = "mpfr")}: ...} } etc. These are documented with the classes \code{\linkS4class{mpfr}} and or \code{\linkS4class{mpfrMatrix}}. } \seealso{ the \code{\linkS4class{array_or_vector}} sub class; \code{\link{cbind-methods}}. } \examples{ ## "Mnumber" encompasses (i.e., "extends") quite a few ## "vector / array - like" classes: showClass("Mnumber") stopifnot(extends("mpfrMatrix", "Mnumber"), extends("array", "Mnumber")) Mnsub <- names(getClass("Mnumber")@subclasses) (mNsub <- names(getClass("mNumber")@subclasses)) ## mNumber has *one* subclass which is not in Mnumber: setdiff(mNsub, Mnsub)# namely "numericVector" ## The following are only subclasses of "Mnumber", but not of "mNumber": setdiff(Mnsub, mNsub) } \keyword{classes} Rmpfr/man/mpfrArray.Rd0000644000175000017500000000631113735036657014517 0ustar nileshnilesh\name{mpfrArray} \alias{mpfrArray} \title{Construct "mpfrArray" almost as by 'array()'}% <--> ./mpfrMatrix-class.Rd \description{ Utility to construct an \R object of class \code{\linkS4class{mpfrArray}}, very analogously to the numeric \code{\link{array}} function. } \usage{ mpfrArray(x, precBits, dim = length(x), dimnames = NULL, rnd.mode = c("N","D","U","Z","A")) } \arguments{ \item{x}{numeric(like) vector, typically of length \code{prod(dim)} or shorter in which case it is recycled.} \item{precBits}{a number, the maximal precision to be used, in \bold{\emph{bits}}; i.e., \code{53} corresponds to double precision. Must be at least 2.} \item{dim}{the dimension of the array to be created, that is a vector of length one or more giving the maximal indices in each dimension.} \item{dimnames}{either \code{NULL} or the names for the dimensions. This is a list with one component for each dimension, either \code{NULL} or a character vector of the length given by \code{dim} for that dimension.} %% ?array has more, about named dimnames etc... \item{rnd.mode}{a 1-letter string specifying how \emph{rounding} should happen at C-level conversion to MPFR, see details of \code{\link{mpfr}}.} } \value{ an object of class \code{"\linkS4class{mpfrArray}"}, specifically \code{"\linkS4class{mpfrMatrix}"} when \code{length(dim) == 2}. } \seealso{\code{\link{mpfr}}, \code{\link{array}}; \code{\link{asNumeric}()} as \dQuote{inverse} of \code{mpfrArray()}, to get back a numeric array. \code{\link{mpfr2array}(x)} is for \code{"mpfr"} classed \code{x}, only, whereas \code{mpfrArray(x)} is for numeric (\dQuote{non-mpfr}) \code{x}. } \examples{ ## preallocating is possible here too ma <- mpfrArray(NA, prec = 80, dim = 2:4) validObject(A2 <- mpfrArray(1:24, prec = 64, dim = 2:4)) ## recycles, gives an "mpfrMatrix" and dimnames : mat <- mpfrArray(1:5, 64, dim = c(5,3), dimnames=list(NULL, letters[1:3])) mat asNumeric(mat) stopifnot(identical(asNumeric(mat), matrix(1:5 +0, 5,3, dimnames=dimnames(mat)))) ## Testing the apply() method : apply(mat, 2, range) apply(A2, 1:2, range) apply(A2, 2:3, max) (fA2 <- apply(A2, 2, fivenum)) a2 <- as(A2, "array") stopifnot(as(apply(A2, 2, range), "matrix") == apply(a2, 2, range) , all.equal(fA2, apply(a2, 2, fivenum)) , all.equal(apply(A2, 2, quantile), apply(a2, 2, quantile)) , all.equal(A2, apply(A2, 2:3, identity) -> aA2, check.attributes=FALSE) , dim(A2) == dim(aA2) ) \dontshow{ for(nf in c("colSums", "colMeans", "rowSums", "rowMeans")) { FUN <- getFunction(nf) for(di in c(1,2)) { r <- FUN(a2, dims = di) R <- FUN(A2, dims = di) stopifnot(identical(dim(r), dim(R)), # possibly both NULL all.equal(as(R, if(is.array(r)) "array" else "numeric"), unname(r), tol = 1e-15)) } } ## with non-trivial dimnames: ma2 <- mat dimnames(ma2) <- list(row=paste0("r",1:5), col=colnames(mat)) stopifnot(identical(ma2, apply(ma2, 2, identity)), identical(ma2, t(apply(ma2, 1, identity))), identical(names(apply(ma2,2,sum)), colnames(ma2)) ) }%end{ dontshow } } \keyword{array} Rmpfr/man/pmax.Rd0000644000175000017500000000336211764636731013523 0ustar nileshnilesh\name{pmax} \Rdversion{1.1} \alias{pmax} \alias{pmin} \alias{pmax-methods} \alias{pmin-methods} \alias{pmax,ANY-method} \alias{pmax,mNumber-method} \alias{pmin,ANY-method} \alias{pmin,mNumber-method} \title{Parallel Maxima and Minima} \description{ Returns the parallel maxima and minima of the input values. The functions \code{pmin} and \code{pmax} have been made S4 generics, and this page documents the \dQuote{\code{...} method for class \code{"mNumber"}}, i.e., for arguments that are numeric or from \code{\link{class} "\linkS4class{mpfr}"}. } \usage{ pmax(\dots, na.rm = FALSE) pmin(\dots, na.rm = FALSE) } \arguments{ \item{\dots}{numeric or arbitrary precision numbers (class \code{\linkS4class{mpfr}}).} \item{na.rm}{a logical indicating whether missing values should be removed.} } \details{ See \code{\link[base:Extremes]{pmax}}, the documentation of the base functions, i.e., default methods. } \value{ vector-like, of length the longest of the input vectors; typically of class \code{\linkS4class{mpfr}}, for the methods here. } \section{Methods}{ \describe{ \item{... = "ANY"}{the default method, really just \code{\link[base:Extremes]{base::pmin}} or \code{base::pmax}, respectively.} \item{... = "mNumber"}{the method for \code{\linkS4class{mpfr}} arguments, mixed with numbers; designed to follow the same semantic as the default method.} } } \seealso{ The documentation of the \pkg{base} functions, \code{\link[base:Extremes]{pmin}} and \code{pmax}; also \code{\link{min}} and \code{max}; further, \code{\link{range}} (\emph{both} min and max). } \examples{ (pm <- pmin(1.35, mpfr(0:10, 77))) stopifnot(pm == pmin(1.35, 0:10)) } \keyword{methods} \keyword{univar} \keyword{arith} Rmpfr/man/Bessel_mpfr.Rd0000644000175000017500000000463214134764740015014 0ustar nileshnilesh\name{Bessel_mpfr} \title{Bessel functions of Integer Order in multiple precisions} \alias{Bessel_mpfr} \alias{Ai} \alias{j0} \alias{j1} \alias{jn} \alias{y0} \alias{y1} \alias{yn} \description{ Bessel functions of integer orders, provided via arbitrary precision algorithms from the MPFR library. Note that the computation can be very slow when \code{n} \emph{and} \code{x} are large (and of similar magnitude). % e.g. on nb-mm3, jn(4e4, 4e4) takes 14 sec [1.1. 2015] } \usage{ Ai(x) j0(x) j1(x) jn(n, x, rnd.mode = c("N","D","U","Z","A")) y0(x) y1(x) yn(n, x, rnd.mode = c("N","D","U","Z","A")) } \arguments{ \item{x}{a \code{\link{numeric}} or \code{\linkS4class{mpfr}} vector.} \item{n}{non-negative integer (vector).} \item{rnd.mode}{a 1-letter string specifying how \emph{rounding} should happen at C-level conversion to MPFR, see \code{\link{mpfr}}.} } \value{ Computes multiple precision versions of the Bessel functions of \emph{integer} order, \eqn{J_n(x)}{J[n](x)} and \eqn{Y_n(x)}{Y[n](x)}, and---when using MPFR library 3.0.0 or newer---also of the Airy function \eqn{Ai(x)}. Note that currently \code{Ai(x)} is very slow to compute for large \code{x}. } \seealso{\code{\link{besselJ}}, and \code{\link{besselY}} compute the same bessel functions but for arbitrary \emph{real} order and only precision of a bit more than ten digits. %% Connection Formulas https://dlmf.nist.gov/10.27 [ J,Y <--> I,K ] but %% via *complex* args } \examples{ x <- (0:100)/8 # (have exact binary representation) stopifnot(exprs = { all.equal(besselY(x, 0), bY0 <- y0(x)) all.equal(besselJ(x, 1), bJ1 <- j1(x)) all.equal(yn(0,x), bY0) all.equal(jn(1,x), bJ1) }) mpfrVersion() # now typically 4.1.0 if(mpfrVersion() >= "3.0.0") { ## Ai() not available previously print( aix <- Ai(x) ) plot(x, aix, log="y", type="l", col=2) stopifnot( all.equal(Ai (0) , 1/(3^(2/3) * gamma(2/3))) , # see https://dlmf.nist.gov/9.2.ii all.equal(Ai(100), mpfr("2.6344821520881844895505525695264981561e-291"), tol=1e-37) ) two3rd <- 2/mpfr(3, 144) print( all.equal(Ai(0), 1/(3^two3rd * gamma(two3rd)), tol=0) ) # 1.7....e-40 if(Rmpfr:::doExtras()) withAutoprint({ # slowish: system.time(ai1k <- Ai(1000)) # 1.4 sec (on 2017 lynne) stopifnot(all.equal(print(log10(ai1k)), -9157.031193409585185582, tol=2e-16)) # seen 8.8..e-17 | 1.1..e-16 }) } # ver >= 3.0 } \keyword{math} Rmpfr/man/chooseMpfr.Rd0000644000175000017500000001314614026150166014647 0ustar nileshnilesh\name{chooseMpfr} \alias{chooseMpfr} \alias{chooseMpfr.all} \alias{pochMpfr} \title{Binomial Coefficients and Pochhammer Symbol aka Rising Factorial} \description{ Compute binomial coefficients, \code{chooseMpfr(a,n)} being mathematically the same as \code{\link{choose}(a,n)}, but using high precision (MPFR) arithmetic. \code{chooseMpfr.all(n)} means the vector \code{\link{choose}(n, 1:n)}, using enough bits for exact computation via MPFR. However, \code{chooseMpfr.all()} is now \bold{deprecated} in favor of \code{\link[gmp]{chooseZ}} from package \pkg{gmp}, as that is now vectorized. \code{pochMpfr()} computes the Pochhammer symbol or \dQuote{rising factorial}, also called the \dQuote{Pochhammer function}, \dQuote{Pochhammer polynomial}, \dQuote{ascending factorial}, \dQuote{rising sequential product} or \dQuote{upper factorial}, \deqn{x^{(n)}=x(x+1)(x+2)\cdots(x+n-1)= \frac{(x+n-1)!}{(x-1)!} = \frac{\Gamma(x+n)}{\Gamma(x)}. }{x^(n) = x(x+1)(x+2)...(x+n-1) = (x+n-1)! / (x-1)! = Gamma(x+n) / Gamma(x).} } \usage{ chooseMpfr (a, n, rnd.mode = c("N","D","U","Z","A")) chooseMpfr.all(n, precBits=NULL, k0=1, alternating=FALSE) pochMpfr(a, n, rnd.mode = c("N","D","U","Z","A")) } \arguments{ \item{a}{a numeric or \code{\linkS4class{mpfr}} vector.} \item{n}{an \code{\link{integer}} vector; if not of length one, \code{n} and \code{a} are recycled to the same length.} \item{rnd.mode}{a 1-letter string specifying how \emph{rounding} should happen at C-level conversion to MPFR, see \code{\link{mpfr}}.} \item{precBits}{integer or NULL for increasing the default precision of the result.} \item{k0}{integer scalar} \item{alternating}{logical, for \code{chooseMpfr.all()}, indicating if \emph{alternating sign} coefficients should be returned, see below.} } \note{ Currently this works via a (C level) \code{for(i in 1:n)}-loop which really slow for large \code{n}, say \eqn{10^6}, with computational cost \eqn{O(n^2)}. In such cases, if you need high precision \code{choose(a,n)} (or Pochhammer(a,n)) for large \code{n}, preferably work with the corresponding \code{\link{factorial}(mpfr(..))}, or \code{\link{gamma}(mpfr(..))} terms. } \value{ For \describe{ \item{\code{chooseMpfr()}, \code{pochMpfr()}:}{an \code{\linkS4class{mpfr}} vector of length \code{max(length(a), length(n))};} \item{\code{chooseMpfr.all(n, k0)}:}{a \code{mpfr} vector of length \code{n-k0+1}, of binomial coefficients \eqn{C_{n,m}}{C[n,m]} or, if \code{alternating} is true, \eqn{(-1)^m\cdot C_{n,m}}{(-1)^m * C[n,m]} for \eqn{m \in}{m in} \code{k0:n}.} } } \seealso{ \code{\link{choose}(n,m)} (\pkg{base} \R) computes the binomial coefficient \eqn{C_{n,m}}{C[n,m]} which can also be expressed via Pochhammer symbol as \eqn{C_{n,m} = (n-m+1)^{(m)}/m!}{C[n,m] = (n-m+1)^(m) / m!}. \code{\link[gmp]{chooseZ}} from package \pkg{gmp}; for now, %% as we "deprecate" it, in favor of factorialZ() : \code{\link{factorialMpfr}}. For (alternating) binomial sums, directly use \code{\link{sumBinomMpfr}}, as that is potentially % once we do it in C more efficient. } \examples{ pochMpfr(100, 4) == 100*101*102*103 # TRUE a <- 100:110 pochMpfr(a, 10) # exact (but too high precision) x <- mpfr(a, 70)# should be enough (px <- pochMpfr(x, 10)) # the same as above (needing only 70 bits) stopifnot(pochMpfr(a, 10) == px, px[1] ==prod(mpfr(100:109, 100)))# used to fail (c1 <- chooseMpfr(1000:997, 60)) # -> automatic "correct" precision stopifnot(all.equal(c1, choose(1000:997, 60), tolerance=1e-12)) ## --- Experimenting & Checking n.set <- c(1:10, 20, 50:55, 100:105, 200:203, 300:303, 500:503, 699:702, 999:1001) if(!Rmpfr:::doExtras()) { ## speed up: smaller set n. <- n.set[-(1:10)] n.set <- c(1:10, n.[ c(TRUE, diff(n.) > 1)]) } C1 <- C2 <- numeric(length(n.set)) for(i.n in seq_along(n.set)) { cat(n <- n.set[i.n],":") C1[i.n] <- system.time(c.c <- chooseMpfr.all(n) )[1] C2[i.n] <- system.time(c.2 <- chooseMpfr(n, 1:n))[1] stopifnot(is.whole(c.c), c.c == c.2, if(n > 60) TRUE else all.equal(c.c, choose(n, 1:n), tolerance = 1e-15)) cat(" [Ok]\n") } matplot(n.set, cbind(C1,C2), type="b", log="xy", xlab = "n", ylab = "system.time(.) [s]") legend("topleft", c("chooseMpfr.all(n)", "chooseMpfr(n, 1:n)"), pch=as.character(1:2), col=1:2, lty=1:2, bty="n") ## Currently, chooseMpfr.all() is faster only for large n (>= 300) ## That would change if we used C-code for the *.all() version ## If you want to measure more: measureMore <- TRUE measureMore <- FALSE if(measureMore) { ## takes ~ 2 minutes (on "lynne", Intel i7-7700T, ~2019) n.s <- 2^(5:20) r <- lapply(n.s, function(n) { N <- ceiling(10000/n) cat(sprintf("n=\%9g => N=\%d: ",n,N)) ct <- system.time(C <- replicate(N, chooseMpfr(n, n/2))) cat("[Ok]\n") list(C=C, ct=ct/N) }) print(ct.n <- t(sapply(r, `[[`, "ct"))) hasSfS <- requireNamespace("sfsmisc") plot(ct.n[,"user.self"] ~ n.s, xlab=quote(n), ylab="system.time(.) [s]", main = "CPU Time for chooseMpfr(n, n/2)", log ="xy", type = "b", axes = !hasSfS) if(hasSfS) for(side in 1:2) sfsmisc::eaxis(side) summary(fm <- lm(log(ct.n[,"user.self"]) ~ log(n.s), subset = n.s >= 10^4)) ## --> slope ~= 2 ==> It's O(n^2) nn <- 2^seq(11,21, by=1/16) ; Lcol <- adjustcolor(2, 1/2) bet <- coef(fm) lines(nn, exp(predict(fm, list(n.s = nn))), col=Lcol, lwd=3) text(500000,1, substitute(AA \%*\% n^EE, list(AA = signif(exp(bet[1]),3), EE = signif( bet[2], 3))), col=2) } # measure more }% example \keyword{arith} Rmpfr/man/factorialMpfr.Rd0000644000175000017500000000341512561376373015345 0ustar nileshnilesh\name{factorialMpfr} \alias{factorialMpfr} \title{Factorial 'n!' in Arbitrary Precision} \description{ Efficiently compute \eqn{n!} in arbitrary precision, using the MPFR-internal implementation. This is mathematically (but not numerically) the same as \eqn{\Gamma(n+1)}{Gamma(n+1)}. %% FIXME: factorialZ() is not yet *vectorized* __ FIXME ___ \code{\link[gmp]{factorialZ}} (package \pkg{gmp}) should typically be used \emph{instead} of \code{factorialMpfr()} nowadays. Hence, \code{factorialMpfr} now is somewhat \bold{deprecated}. } \usage{ factorialMpfr(n, precBits = max(2, ceiling(lgamma(n+1)/log(2))), rnd.mode = c("N","D","U","Z","A")) } \arguments{ \item{n}{non-negative integer (vector).} \item{precBits}{desired precision in bits (\dQuote{binary digits}); the default sets the precision high enough for the result to be \emph{exact}.} \item{rnd.mode}{a 1-letter string specifying how \emph{rounding} should happen at C-level conversion to MPFR, see \code{\link{mpfr}}.} } \value{ a number of (S4) class \code{\linkS4class{mpfr}}. } \seealso{ \code{\link{factorial}} and \code{\link{gamma}} in base \R. \code{\link[gmp]{factorialZ}} (package \pkg{gmp}), to \emph{replace} \code{factorialMpfr}, see above. \code{chooseMpfr()} and \code{\link{pochMpfr}()} (on the same page). } \examples{ factorialMpfr(200) n <- 1000:1010 f1000 <- factorialMpfr(n) stopifnot(1e-15 > abs(as.numeric(1 - lfactorial(n)/log(f1000)))) ## Note that---astonishingly--- measurements show only ## *small* efficiency gain of ~ 10\% : over using the previous "technique" system.time(replicate(8, f1e4 <- factorialMpfr(10000))) system.time(replicate(8, f.1e4 <- factorial(mpfr(10000, prec=1+lfactorial(10000)/log(2))))) } \keyword{arith} Rmpfr/man/formatMpfr.Rd0000644000175000017500000001521513523513201014650 0ustar nileshnilesh\name{formatMpfr} \title{Formatting MPFR (multiprecision) Numbers} \alias{formatMpfr} \alias{formatN.mpfr} \alias{.mpfr2str} \description{ Flexible formatting of \dQuote{multiprecision numbers}, i.e., objects of class \code{\linkS4class{mpfr}}. \code{formatMpfr()} is also the \code{mpfr} method of the generic \code{\link{format}} function. The \code{formatN()} methods for \code{\linkS4class{mpfr}} numbers renders them differently than their double precision equivalents, by appending \code{"_M"}. Function \code{.mpfr2str()} is the low level work horse for \code{formatMpfr()} and hence all \code{\link{print}()}ing of \code{"\linkS4class{mpfr}"} objects. } \usage{ formatMpfr(x, digits = NULL, trim = FALSE, scientific = NA, maybe.full = !is.null(digits) && is.na(scientific), base = 10, showNeg0 = TRUE, max.digits = Inf, big.mark = "", big.interval = 3L, small.mark = "", small.interval = 5L, decimal.mark = ".", exponent.char = if(base <= 14) "e" else if(base <= 36) "E" else "|e", exponent.plus = TRUE, zero.print = NULL, drop0trailing = FALSE, ...) \S3method{formatN}{mpfr}(x, drop0trailing = TRUE, \dots) .mpfr2str(x, digits = NULL, maybe.full = !is.null(digits), base = 10L) } \arguments{ \item{x}{an MPFR number (vector or array).} \item{digits}{how many significant digits (in the \code{base} chosen!) are to be used in the result. The default, \code{NULL}, uses enough digits to represent the full precision, often one or two digits more than \dQuote{you} would expect. For \code{base}s 2,4,8,16, or 32, MPFR requires \code{digits} at least 2. For such bases, \code{digits = 1} is changed into \code{2}, with a message.} \item{trim}{logical; if \code{FALSE}, numbers are right-justified to a common width: if \code{TRUE} the leading blanks for justification are suppressed.} \item{scientific}{either a logical specifying whether MPFR numbers should be encoded in scientific format (\dQuote{exponential representation}), or an integer penalty (see \code{\link{options}("scipen")}). Missing values correspond to the current default penalty.} \item{maybe.full}{\code{\link{logical}}, passed to \code{\link{.mpfr2str}()}.} \item{base}{an integer in \eqn{2,3,..,62}; the base (\dQuote{basis}) in which the numbers should be represented. Apart from the default base 10, binary (\code{base = 2}) or hexadecimal (\code{base = 16}) are particularly interesting.} \item{showNeg0}{logical indicating if \dQuote{\bold{neg}ative} zeros should be shown with a \code{"-"}. The default, \code{TRUE} is intentially different from \code{\link{format}()}.} \item{exponent.char}{the \dQuote{exponent} character to be used in scientific notation. The default takes into account that for \code{base} \eqn{B \ge 15}{B >= 15}, \code{"e"} is part of the (mantissa) digits and the same is true for \code{"E"} when \eqn{B \ge 37}{B >= 37}.} \item{exponent.plus}{\code{\link{logical}} indicating if \code{"+"} should be for positive exponents in exponential (aka \dQuote{scientific}) representation. This used to be hardcoded to \code{FALSE}; the new default is compatible to \R's \code{\link{format}()}ing of numbers and helps to note visually when exponents are in use.} \item{max.digits}{a (large) positive number to limit the number of (mantissa) digits, notably when \code{digits} is \code{NULL} (as by default). Otherwise, a numeric \code{digits} is \emph{preferred} to setting \code{max.digits} (which should not be smaller than \code{digits}).} \item{big.mark, big.interval, small.mark, small.interval, decimal.mark, zero.print, drop0trailing}{% used for prettying decimal sequences, these are passed to \code{\link{prettyNum}} and that help page explains the details.} \item{\dots}{further arguments passed to or from other methods.} } \value{ a character vector or array, say \code{cx}, of the same length as \code{x}. Since Rmpfr version 0.5-3 (2013-09), if \code{x} is an \code{\linkS4class{mpfrArray}}, then \code{cx} is a character \code{\link{array}} with the same \code{\link{dim}} and \code{\link{dimnames}} as \code{x}. Note that in scientific notation, the integer exponent is always in \emph{decimal}, i.e., base 10 (even when \code{base} is not 10), but of course meaning \code{base} powers, e.g., in base 32, \code{"u.giE3"}is the same as \code{"ugi0"} which is \eqn{32^3} times \code{"u.gi"}. This is in contrast, e.g., with \code{\link{sprintf}("\%a", x)} where the powers after \code{"p"} are powers of \eqn{2}. } \references{ The MPFR manual's description of \samp{mpfr_get_str()} which is the C-internal workhorse for \code{.mpfr2str()} (on which \code{formatMpfr()} builds).% as we say in description{..} already } \author{Martin Maechler} \seealso{ \code{\link{mpfr}} for creation and the \code{\linkS4class{mpfr}} class description with its many methods. The \code{\link{format}} generic, and the \code{\link{prettyNum}} utility on which \code{formatMpfr} is based as well. The S3 generic function \code{\link[gmp]{formatN}} from package \pkg{gmp}. \code{\link{.mpfr_formatinfo}(x)} provides the (cheap) non-string parts of \code{.mpfr2str(x)}; the (base 2) \code{exp} exponents are also available via \code{\link{.mpfr2exp}(x)}. } \examples{ ## Printing of MPFR numbers uses formatMpfr() internally. ## Note how each components uses the "necessary" number of digits: ( x3 <- c(Const("pi", 168), mpfr(pi, 140), 3.14) ) format(x3[3], 15) format(x3[3], 15, drop0 = TRUE)# "3.14" .. dropping the trailing zeros x3[4] <- 2^30 x3[4] # automatically drops trailing zeros format(x3[1], dig = 41, small.mark = "'") # (41 - 1 = ) 40 digits after "." rbind(formatN( x3, digits = 15), formatN(as.numeric(x3), digits = 15)) (Zero <- mpfr(c(0,1/-Inf), 20)) # 0 and "-0" xx <- c(Zero, 1:2, Const("pi", 120), -100*pi, -.00987) format(xx, digits = 2) format(xx, digits = 1, showNeg0 = FALSE)# "-0" no longer shown ## Output in other bases : formatMpfr(mpfr(10^6, 40), base=32, drop0trailing=TRUE) ## "ugi0" mpfr("ugi0", base=32) #-> 1'000'000 \dontshow{ stopifnot( identical("ugi0", formatMpfr(mpfr(10^6, 40), base=32, drop0trailing=TRUE)), mpfr("ugi0", base=32) == 10^6) } i32 <- mpfr(1:32, precBits = 64) format(i32, base= 2, drop0trailing=TRUE) format(i32, base= 16, drop0trailing=TRUE) format(1/i32, base= 2, drop0trailing=TRUE)# using scientific notation for [17..32] format(1/i32, base= 32) format(1/i32, base= 62, drop0trailing=TRUE) format(mpfr(2, 64)^-(1:16), base=16, drop0trailing=TRUE) } \keyword{character} \keyword{print} Rmpfr/man/unirootR.Rd0000644000175000017500000001374313336100221014354 0ustar nileshnilesh\name{unirootR} \alias{unirootR} \title{One Dimensional Root (Zero) Finding -- in pure \R} \usage{ unirootR(f, interval, \dots, lower = min(interval), upper = max(interval), f.lower = f(lower, ...), f.upper = f(upper, ...), verbose = FALSE, tol = .Machine$double.eps^0.25, maxiter = 1000, warn.no.convergence = TRUE, epsC = NULL) } \arguments{ \item{f}{the function for which the root is sought.} \item{interval}{a vector containing the end-points of the interval to be searched for the root.} \item{\dots}{additional named or unnamed arguments to be passed to \code{f}} \item{lower, upper}{the lower and upper end points of the interval to be searched.} \item{f.lower, f.upper}{the same as \code{f(upper)} and \code{f(lower)}, respectively. Passing these values from the caller where they are often known is more economical as soon as \code{f()} contains non-trivial computations.} \item{verbose}{logical (or integer) indicating if (and how much) verbose output should be produced during the iterations.} \item{tol}{the desired accuracy (convergence tolerance).} \item{maxiter}{the maximum number of iterations.} \item{warn.no.convergence}{if set to \code{FALSE} there's no warning about non-convergence. Useful to just run a few iterations.} \item{epsC}{positive number or \code{NULL} in which case a smart default is sought. This should specify the \dQuote{achievable machine precision} \emph{for} the given numbers and their arithmetic. The default will set this to \code{\link{.Machine}$double.eps} for double precision numbers, and will basically use \code{2 ^ - min(getPrec(f.lower), getPrec(f.upper))} when that works (as, e.g., for \code{\linkS4class{mpfr}}-numbers) otherwise. This is factually a lower bound for the achievable lower bound, and hence, setting \code{tol} smaller than \code{epsC} is typically non-sensical sense and produces a warning. } } \description{ The function \code{unirootR} searches the interval from \code{lower} to \code{upper} for a root (i.e., zero) of the function \code{f} with respect to its first argument. \code{unirootR()} is \dQuote{clone} of \code{\link{uniroot}()}, written entirely in \R, in a way that it works with \code{\linkS4class{mpfr}}-numbers as well. } \details{ Note that arguments after \code{\dots} must be matched exactly. Either \code{interval} or both \code{lower} and \code{upper} must be specified: the upper endpoint must be strictly larger than the lower endpoint. The function values at the endpoints must be of opposite signs (or zero). The function only uses \R code with basic arithmetic, such that it should also work with \dQuote{generalized} numbers (such as \code{\linkS4class{mpfr}}-numbers) as long the necessary \code{\link{Ops}} methods are defined for those. The underlying algorithm assumes a continuous function (which then is known to have at least one root in the interval). Convergence is declared either if \code{f(x) == 0} or the change in \code{x} for one step of the algorithm is less than \code{tol} (plus an allowance for representation error in \code{x}). If the algorithm does not converge in \code{maxiter} steps, a warning is printed and the current approximation is returned. \code{f} will be called as \code{f(\var{x}, ...)} for a (generalized) numeric value of \var{x}. } \value{ A list with four components: \code{root} and \code{f.root} give the location of the root and the value of the function evaluated at that point. \code{iter} and \code{estim.prec} give the number of iterations used and an approximate estimated precision for \code{root}. (If the root occurs at one of the endpoints, the estimated precision is \code{NA}.) } \source{ Based on \code{zeroin()} (in package \pkg{rootoned}) by John Nash who manually translated the C code in \R's \code{zeroin.c} and on \code{\link{uniroot}()} in \R's sources. } \references{ Brent, R. (1973), see \code{\link{uniroot}}. } \seealso{ \code{\link{polyroot}} for all complex roots of a polynomial; \code{\link{optimize}}, \code{\link{nlm}}. } \examples{ require(utils) # for str ## some platforms hit zero exactly on the first step: ## if so the estimated precision is 2/3. f <- function (x,a) x - a str(xmin <- unirootR(f, c(0, 1), tol = 0.0001, a = 1/3)) ## handheld calculator example: fixpoint of cos(.): rc <- unirootR(function(x) cos(x) - x, lower=-pi, upper=pi, tol = 1e-9) rc$root ## the same with much higher precision: rcM <- unirootR(function(x) cos(x) - x, interval= mpfr(c(-3,3), 300), tol = 1e-40) rcM x0 <- rcM$root stopifnot(all.equal(cos(x0), x0, tol = 1e-40))## 40 digits accurate! str(unirootR(function(x) x*(x^2-1) + .5, lower = -2, upper = 2, tol = 0.0001), digits.d = 10) str(unirootR(function(x) x*(x^2-1) + .5, lower = -2, upper = 2, tol = 1e-10 ), digits.d = 10) ## A sign change of f(.), but not a zero but rather a "pole": tan. <- function(x) tan(x * (Const("pi",200)/180))# == tan( ) (rtan <- unirootR(tan., interval = mpfr(c(80,100), 200), tol = 1e-40)) ## finds 90 {"ok"}, and now gives a warning \dontshow{stopifnot(all.equal(rtan$root, 90, tolerance = 1e-38))} ## Find the smallest value x for which exp(x) > 0 (numerically): r <- unirootR(function(x) 1e80*exp(x)-1e-300, c(-1000,0), tol = 1e-15) str(r, digits.d = 15) ##> around -745, depending on the platform. exp(r$root) # = 0, but not for r$root * 0.999... minexp <- r$root * (1 - 10*.Machine$double.eps) exp(minexp) # typically denormalized ## --- using mpfr-numbers : ## Find the smallest value x for which exp(x) > 0 ("numerically"); ## Note that mpfr-numbers underflow *MUCH* later than doubles: ## one of the smallest mpfr-numbers {see also ?mpfr-class } : (ep.M <- mpfr(2, 55) ^ - ((2^30 + 1) * (1 - 1e-15))) r <- unirootR(function(x) 1e99* exp(x) - ep.M, mpfr(c(-1e20, 0), 200)) r # 97 iterations; f.root is very similar to ep.M } \keyword{optimize} Rmpfr/man/utils.Rd0000644000175000017500000000555412612522074013706 0ustar nileshnilesh\name{mpfr.utils} \title{MPFR Number Utilities} \alias{c.mpfr} \alias{diff.mpfr} \alias{mpfrIs0} \alias{.mpfr.is.whole} \alias{mpfrVersion} %% next two are deprecated since Aug.2015 (for Rmpfr 0.6.0): \alias{mpfr.is.0} \alias{mpfr.is.integer} % \description{ \code{mpfrVersion()} returns the version of the MPFR library which \pkg{Rmpfr} is currently linked to. \code{\link{c}(x,y,...)} can be used to combine MPFR numbers in the same way as regular numbers \bold{IFF} the first argument \code{x} is of class \code{\linkS4class{mpfr}}. \code{mpfrIs0(.)} uses the MPFR library in the documented way to check if (a vector of) MPFR numbers are zero. It was called \code{mpfr.is.0} which is strongly deprecated now. \code{.mpfr.is.whole(x)} uses the MPFR library in the documented way to check if (a vector of) MPFR numbers is integer \emph{valued}. This is equivalent to \code{x == round(x)}, but \emph{not} at all to \code{is.integer(as(x, "numeric"))}.\cr You should typically rather use (the \code{"mpfr"} method of the generic function) \code{\link{is.whole}(x)} instead. The former name \code{mpfr.is.integer} is deprecated now. } \usage{ mpfrVersion() mpfrIs0(x) %% .mpfr.is.whole(x) \method{c}{mpfr}(\dots) \method{diff}{mpfr}(x, lag = 1L, differences = 1L, \dots) } \arguments{ \item{x}{an object of class \code{\linkS4class{mpfr}}.} \item{\dots}{for \code{diff}, further \code{\linkS4class{mpfr}} class objects or simple numbers (\code{\link{numeric}} vectors) which are coerced to \code{mpfr} with default precision of 128 bits.} \item{lag, differences}{for \code{diff()}: exact same meaning as in \code{\link{diff}()}'s default method, \code{\link{diff.default}}.} } % \details{ % ~~ If necessary, more details than the description above ~~ % } \value{ \code{mpfrIs0} returns a logical vector of length \code{length(x)} with values \code{TRUE} iff the corresponding \code{x[i]} is an MPFR representation of zero (\code{0}). \cr Similarly, \code{.mpfr.is.whole} and \code{is.whole} return a logical vector of length \code{length(x)}. \code{mpfrVersion} returns an object of S3 class \code{"\link{numeric_version}"}, so it can be used in comparisons. The other functions return MPFR number (vectors), i.e., extending class \code{\linkS4class{mpfr}}. } \seealso{ \code{\link{str.mpfr}} for the \code{\link{str}} method. \code{\link{erf}} for special mathematical functions on MPFR. The class description \code{\linkS4class{mpfr}} page mentions many generic arithmetic and mathematical functions for which \code{"mpfr"} methods are available. } \examples{ mpfrVersion() (x <- c(Const("pi", 64), mpfr(-2:2, 64))) mpfrIs0(x) # one of them is x[mpfrIs0(x)] # but it may not have been obvious.. str(x) x <- rep(-2:2, 5) stopifnot(is.whole(mpfr(2, 500) ^ (1:200)), all.equal(diff(x), diff(as.numeric(x)))) } \keyword{arith} Rmpfr/man/igamma.Rd0000644000175000017500000000463313640371676014012 0ustar nileshnilesh\name{igamma} \alias{igamma} \title{Incomplete Gamma Function} \description{% >> ../R/special-fun.R <<< For MPFR version >= 3.2.0, the following MPFR library function is provided: \code{mpfr_gamma_inc(a,x)}, the \R interface of which is \code{igamma(a,x)}, where \code{igamma(a,x)} is the \dQuote{upper} incomplete gamma function %% fails in LaTeX (R "bug"): \deqn{γ(a,x) :=: Γ(a) - Γ(a,x),} \deqn{\Gamma(a,x) :=: \Gamma(a) - \gamma(a,x),}{Γ(a,x) :=: Γ(a) - γ(a,x),} where \deqn{\gamma(a,x) := \int_0^x t^{a-1} e^{-t} dt,}{γ(a,x) := ∫₀ˣ tᵃâ»Â¹ eâ»áµ— dt,} and hence \deqn{\Gamma(a,x) := \int_x^\infty t^{a-1} e^{-t} dt,}{Γ(a,x) := ∫ (x..∞) tᵃâ»Â¹ eâ»áµ— dt,} and \deqn{\Gamma(a) := \gamma(a, \infty).}{Γ(a) := γ(a, ∞).} As \R's \code{\link{pgamma}(x,a)} is \deqn{\code{pgamma(x, a)} := \gamma(a,x) / \Gamma(a),}{\code{pgamma(x, a)} := γ(a,x) / Γ(a),} we get \preformatted{ igamma(a,x) == gamma(a) * pgamma(x, a, lower.tail=FALSE)} } \usage{ igamma(a, x, rnd.mode = c("N", "D", "U", "Z", "A")) } %% MM FIXME: "Copy paste" from hypot() -- which strangely we have in >> ./mpfr-class.Rd << \arguments{ \item{a, x}{an object of class \code{mpfr} or \code{\link{numeric}}.} \item{rnd.mode}{a 1-letter string specifying how \emph{rounding} should happen at C-level conversion to MPFR, see \code{\link{mpfr}}.} } %% \details{ %% } \value{ a numeric vector of \dQuote{common length}, recyling along \code{a} and \code{x}. } \references{ NIST Digital Library of Mathematical Functions, section 8.2. \url{https://dlmf.nist.gov/8.2.i} Wikipedia (2019). \emph{Incomplete gamma function}; \url{https://en.wikipedia.org/wiki/Incomplete_gamma_function} %% .. arXiv paper TODO % see --> ../TODO } \author{\R interface: Martin Maechler} \seealso{ \R's \code{\link{gamma}} (function) and \code{\link{pgamma}} (probability distribution). } \examples{ ## show how close pgamma() is : x <- c(seq(0,20, by=1/4), 21:50, seq(55, 100, by=5)) if(mpfrVersion() >= "3.2.0") { print( all.equal(igamma(Const("pi", 80), x), pgamma(x, pi, lower.tail=FALSE) * gamma(pi), tol=0, formatFUN = function(., ...) format(., digits = 7)) #-> 3.13e-16 ) ## and ensure *some* closeness: stopifnot(exprs = { all.equal(igamma(Const("pi", 80), x), pgamma(x, pi, lower.tail=FALSE) * gamma(pi), tol = 1e-15) }) } # only if MPFR version >= 3.2.0 } \keyword{math} Rmpfr/man/hjkMpfr.Rd0000644000175000017500000001153613752457464014164 0ustar nileshnilesh\name{hjkMpfr} \alias{hjkMpfr} \title{Hooke-Jeeves Derivative-Free Minimization R (working for MPFR)} \description{ An implementation of the Hooke-Jeeves algorithm for derivative-free optimization. %% TODO: hjkb() A bounded and an unbounded version are provided. --> ~/R/Pkgs/dfoptim/R/ This is a slight adaption \code{\link[dfoptim]{hjk}()} from package \CRANpkg{dfoptim}. } \usage{ hjkMpfr(par, fn, control = list(), ...) } \arguments{ \item{par}{Starting vector of parameter values. The initial vector may lie on the boundary. If \code{lower[i]=upper[i]} for some \code{i}, the \code{i}-th component of the solution vector will simply be kept fixed.} \item{fn}{Nonlinear objective function that is to be optimized. A scalar function that takes a real vector as argument and returns a scalar that is the value of the function at that point.} \item{control}{\code{\link{list}} of control parameters. See \bold{Details} for more information.} \item{\dots}{Additional arguments passed to \code{fn}.} } \details{ Argument \code{control} is a list specifing changes to default values of algorithm control parameters. Note that parameter names may be abbreviated as long as they are unique. The list items are as follows: \describe{ \item{\code{tol}}{Convergence tolerance. Iteration is terminated when the step length of the main loop becomes smaller than \code{tol}. This does \emph{not} imply that the optimum is found with the same accuracy. Default is 1.e-06.} \item{\code{maxfeval}}{Maximum number of objective function evaluations allowed. Default is Inf, that is no restriction at all.} \item{\code{maximize}}{A logical indicating whether the objective function is to be maximized (TRUE) or minimized (FALSE). Default is FALSE.} \item{\code{target}}{A real number restricting the absolute function value. The procedure stops if this value is exceeded. Default is Inf, that is no restriction.} \item{\code{info}}{A logical variable indicating whether the step number, number of function calls, best function value, and the first component of the solution vector will be printed to the console. Default is FALSE.} } If the minimization process threatens to go into an infinite loop, set either \code{maxfeval} or \code{target}. } \value{ A \code{\link{list}} with the following components: \item{par}{Best estimate of the parameter vector found by the algorithm.} \item{value}{value of the objective function at termination.} \item{convergence}{indicates convergence (\code{TRUE}) or not (\code{FALSE}).} \item{feval}{number of times the objective \code{fn} was evaluated.} \item{niter}{number of iterations (\dQuote{steps}) in the main loop.} } \references{ C.T. Kelley (1999), Iterative Methods for Optimization, SIAM. Quarteroni, Sacco, and Saleri (2007), Numerical Mathematics, Springer. } \note{ This algorithm is based on the Matlab code of Prof. C. T. Kelley, given in his book \dQuote{Iterative methods for optimization}. It has been implemented for package \pkg{dfoptim} with the permission of Prof. Kelley. This version does not (yet) implement a cache for storing function values that have already been computed as searching the cache makes it slower. } \author{Hans W Borchers \email{hwborchers@googlemail.com}; for \pkg{Rmpfr}: John Nash, June 2012. Modifications by Martin Maechler.} % \note{ % } \seealso{ Standard \R's \code{\link{optim}}; \code{\link{optimizeR}} provides \emph{one}-dimensional minimization methods that work with \code{\linkS4class{mpfr}}-class numbers. } \examples{ ## simple smooth example: ff <- function(x) sum((x - c(2:4))^2) str(rr <- hjkMpfr(rep(mpfr(0,128), 3), ff, control=list(info=TRUE))) ## Hooke-Jeeves solves high-dim. Rosenbrock function {but slowly!} rosenbrock <- function(x) { n <- length(x) sum (100*((x1 <- x[1:(n-1)])^2 - x[2:n])^2 + (x1 - 1)^2) } par0 <- rep(0, 10) str(rb.db <- hjkMpfr(rep(0, 10), rosenbrock, control=list(info=TRUE))) \donttest{ ## rosenbrook() is quite slow with mpfr-numbers: str(rb.M. <- hjkMpfr(mpfr(numeric(10), prec=128), rosenbrock, control = list(tol = 1e-8, info=TRUE))) } %% Once we have it: *bounded* version: %% hjkbMpfr(c(0, 0, 0), rosenbrock, upper = 0.5) ## Hooke-Jeeves does not work well on non-smooth functions nsf <- function(x) { f1 <- x[1]^2 + x[2]^2 f2 <- x[1]^2 + x[2]^2 + 10 * (-4*x[1] - x[2] + 4) f3 <- x[1]^2 + x[2]^2 + 10 * (-x[1] - 2*x[2] + 6) max(f1, f2, f3) } par0 <- c(1, 1) # true min 7.2 at (1.2, 2.4) h.d <- hjkMpfr(par0, nsf) # fmin=8 at xmin=(2,2) \donttest{ ## and this is not at all better (but slower!) h.M <- hjkMpfr(mpfr(c(1,1), 128), nsf, control = list(tol = 1e-15)) } %% --> ../demo/hjkMpfr.R : ## --> demo(hjkMpfr) # -> Fletcher's chebyquad function m = n -- residuals } \keyword{optimize} Rmpfr/man/matmult.Rd0000644000175000017500000000507013637431043014225 0ustar nileshnilesh\name{matmult} \title{(MPFR) Matrix (Vector) Multiplication} %% Note : all the %*%, crossprod(), and tcrossprod() methods are documented in %% ---- ===> ./mpfrMatrix-class.Rd %% ^^^^^^^^^^^^^^^^^^^ \alias{matmult} \alias{.matmult.R}% hidden, not exported \description{ Matrix / vector multiplication of \code{\link{mpfr}} (and \dQuote{simple} \code{\link{numeric}}) matrices and vectors. \code{ matmult (x,y, fPrec = 2)} or \code{crossprod(x,y, fPrec = 2)} use higher precision in underlying computations. } \usage{ matmult(x, y, ...) %% .matmult.R(x,y, op = 0L, fPrec = 1, precBits = fPrec * max(getPrec(x), getPrec(y))) } \arguments{ \item{x, y}{\code{\link{numeric}} or \code{\linkS4class{mpfrMatrix}}-classed \R objects, i.e. semantically numeric matrices or vectors.} \item{\dots}{arguments passed to the hidden underlying \code{.matmult.R()} work horse which is also underlying the \code{\link{\%*\%}}, \code{\link{crossprod}()}, and \code{\link{tcrossprod}()} methods, see the \code{\linkS4class{mpfrMatrix}} class documentation: \describe{ \item{fPrec}{a multiplication factor, a positive number determining the number of bits \code{precBits} used for the underlying multiplication and summation arithmetic. The default is \code{fPrec = 1}. Setting \code{fPrec = 2} doubles the precision which has been recommended, e.g., by John Nash.} \item{precBits}{the number of bits used for the underlying multiplication and summation arithmetic; by default \code{precBits = fPrec * max(getPrec(x), getPrec(y))} which typically uses the same accuracy as regular \code{\link{mpfr}}-arithmetic would use.} }} } %% \details{ %% %% ~~ If necessary, more details than the description above ~~ %% } \value{ a (base \R) \code{\link{matrix}} or \code{\linkS4class{mpfrMatrix}}, depending on the classes of \code{x} and \code{y}. } %% \references{ %% } \author{Martin Maechler} \note{ Using \code{matmult(x,y)} instead of \code{x \link{\%*\%} y}, makes sense mainly \emph{if} you use non-default \code{fPrec} or \code{precBits} arguments. The \code{\link{crossprod}()}, and \code{\link{tcrossprod}()} function have the \emph{identical} optional arguments \code{fPrec} or \code{precBits}. } \seealso{ \code{\link{\%*\%}}, \code{\link{crossprod}}, \code{\link{tcrossprod}}. } \examples{ %% ## The function is currently defined as %% function (x, y, ...) %% .matmult.R(x, y, op = 0L, ...) ## FIXME: add example ## 1) matmult() <--> \%*\% ## 2) crossprod() , tcrossprod() %% <--> ./mpfrMatrix-class.Rd examples (!) } \keyword{arith} Rmpfr/man/Rmpfr-package.Rd0000644000175000017500000001032613663753154015232 0ustar nileshnilesh\name{Rmpfr-package} \alias{Rmpfr-package} \alias{Rmpfr} \docType{package} \title{R MPFR - Multiple Precision Floating-Point Reliable} \description{ Rmpfr provides S4 classes and methods for arithmetic including transcendental ("special") functions for arbitrary precision floating point numbers, here often called \dQuote{mpfr - numbers}. To this end, it interfaces to the LGPL'ed MPFR (Multiple Precision Floating-Point Reliable) Library which itself is based on the GMP (GNU Multiple Precision) Library. } \details{ % The DESCRIPTION file: \packageDESCRIPTION{Rmpfr} \packageIndices{Rmpfr} The following (help pages) index does not really mention that we provide \emph{many} methods for mathematical functions, including \code{\link{gamma}}, \code{\link{digamma}}, etc, namely, all of \R's (S4) \code{Math} group (with the only exception of \code{\link{trigamma}}), see the list in the examples. Additionally also \code{\link{pnorm}}, the \dQuote{error function}, and more, see the list in \code{\link{zeta}}, and further note the first vignette (below). %% MM: could try more systematically \bold{\emph{Partial} index}: \tabular{ll}{ \code{\link{mpfr}} \tab Create "mpfr" Numbers (Objects) \cr \code{\link{mpfrArray}} \tab Construct "mpfrArray" almost as by \code{\link{array}()} \cr \code{\link{mpfr-class}} \tab Class "mpfr" of Multiple Precision Floating Point Numbers \cr \code{\link{mpfrMatrix-class}} \tab Classes "mpfrMatrix" and "mpfrArray" \cr \tab \cr \code{\link{Bernoulli}} \tab Bernoulli Numbers in Arbitrary Precision \cr \code{\link{Bessel_mpfr}} \tab Bessel functions of Integer Order in multiple precisions \cr \code{\link{c.mpfr}} \tab MPFR Number Utilities \cr \code{\link{cbind}} \tab "mpfr" \code{...} - Methods for Functions cbind(), rbind() \cr \code{\link{chooseMpfr}} \tab Binomial Coefficients and Pochhammer Symbol aka \cr \tab Rising Factorial \cr \code{\link{factorialMpfr}} \tab Factorial 'n!' in Arbitrary Precision \cr \code{\link{formatMpfr}} \tab Formatting MPFR (multiprecision) Numbers \cr \code{\link{getPrec}} \tab Rmpfr - Utilities for Precision Setting, Printing, etc \cr \code{\link{roundMpfr}} \tab Rounding to Binary bits, "mpfr-internally" \cr \code{\link{seqMpfr}} \tab "mpfr" Sequence Generation \cr \code{\link{sumBinomMpfr}} \tab (Alternating) Binomial Sums via Rmpfr \cr \code{\link{zeta}} \tab Special Mathematical Functions (MPFR) \cr \tab \cr \code{\link{integrateR}} \tab One-Dimensional Numerical Integration - in pure R \cr \code{\link{unirootR}} \tab One Dimensional Root (Zero) Finding - in pure R \cr \code{\link{optimizeR}} \tab High Precisione One-Dimensional Optimization \cr \code{\link{hjkMpfr}} \tab Hooke-Jeeves Derivative-Free Minimization R (working for MPFR) \cr } Further information is available in the following vignettes: \tabular{ll}{ \code{Rmpfr-pkg} \tab Arbitrarily Accurate Computation with R: The 'Rmpfr' package (source, pdf)\cr \code{log1mexp-note} \tab Acccurately Computing log(1 - exp(.)) -- Assessed by Rmpfr (source, pdf)\cr } }%- end{details} \author{Martin Maechler} \references{ MPFR (MP Floating-Point Reliable Library), \url{https://www.mpfr.org/}% or http://mpfr.org/ (unfortunately the % http*s* needs the "www") GMP (GNU Multiple Precision library), \url{https://gmplib.org/} and see the vignettes mentioned above. } \seealso{ The \R package \code{\link[gmp:biginteger]{gmp}} for big integer and rational numbers (\code{\link[gmp]{bigrational}}) on which \pkg{Rmpfr} now depends. } \examples{ ## Using "mpfr" numbers instead of regular numbers... n1.25 <- mpfr(5, precBits = 256)/4 n1.25 ## and then "everything" just works with the desired chosen precision:hig n1.25 ^ c(1:7, 20, 30) ## fully precise; compare with print(1.25 ^ 30, digits=19) exp(n1.25) ## Show all math functions which work with "MPFR" numbers (1 exception: trigamma) getGroupMembers("Math") ## We provide *many* arithmetic, special function, and other methods: showMethods(classes = "mpfr") showMethods(classes = "mpfrArray") } \keyword{package} Rmpfr/man/array_or_vector-class.Rd0000644000175000017500000000173111324121014017026 0ustar nileshnilesh\name{array_or_vector-class} \docType{class} \alias{array_or_vector-class} \title{Auxiliary Class "array\_or\_vector"} \description{ \code{"array_or_vector"} is the class union of \code{c("array", "matrix", "vector")} and exists for its use in signatures of method definitions. } \section{Objects from the Class}{A virtual Class: No objects may be created from it. } % \section{Methods}{ % \describe{ % \item{...}{.....} % } % } \details{ Using \code{"array_or_vector"} instead of just \code{"vector"} in a signature makes an important difference: E.g., if we had \code{setMethod(crossprod, c(x="mpfr", y="vector"), function(x,y) CPR(x,y))}, a call \code{crossprod(x, matrix(1:6, 2,3))} would extend into a call of \code{CPR(x, as(y, "vector"))} such that \code{CPR()}'s second argument would simply be a vector instead of the desired \eqn{2\times3}{2 x 3} matrix. } %\author{Martin Maechler} \examples{ showClass("array_or_vector") } \keyword{classes} Rmpfr/man/str.mpfr.Rd0000644000175000017500000000414113523036312014305 0ustar nileshnilesh\name{str.mpfr} \alias{str.mpfr} \title{Compactly Show STRucture of Rmpfr Number Object} \description{ The \code{\link{str}} method for objects of class \code{\linkS4class{mpfr}} produces a bit more useful output than the default method \code{\link{str.default}}. } \usage{ \method{str}{mpfr}(object, nest.lev, internal = FALSE, give.head = TRUE, digits.d = 12, vec.len = NULL, drop0trailing=TRUE, width = getOption("width"), \dots) } \arguments{ \item{object}{an object of class \code{\linkS4class{mpfr}}.} \item{nest.lev}{for \code{\link{str}()}, typically only used when called by a higher level \code{str()}.} \item{internal}{logical indicating if the low-level internal structure should be shown; if true (not by default), uses \code{str(object@.Data)}.} \item{give.head}{logical indicating if the \dQuote{header} should be printed.} \item{digits.d}{the number of digits to be used, will be passed \code{\link{formatMpfr}()} and hence \code{NULL} will use \dQuote{as many as needed}, i.e. often too many. If this is a number, as per default, less digits will be used in case the precision (\code{\link{getPrec}(object)}) is smaller.} \item{vec.len}{the number of \emph{elements} that will be shown. The default depends on the precision of \code{object} and \code{width} (since \pkg{Rmpfr} 0.6-0, it was \code{3} previously).} \item{drop0trailing}{logical, passed to \code{\link{formatMpfr}()} (with a different default here).} \item{width}{the (approximately) desired width of output, see \code{\link{options}(width = .)}.} \item{\dots}{further arguments, passed to \code{\link{formatMpfr}()}.} } \seealso{ \code{\link{.mpfr2list}()} puts the internal structure into a \code{\link{list}}, and its help page documents many more (low level) utilities. } \examples{ (x <- c(Const("pi", 64), mpfr(-2:2, 64))) str(x) str(list(pi = pi, x.mpfr = x)) str(x ^ 1000) str(x ^ -1e4, digits=NULL) # full precision str(x, internal = TRUE) # internal low-level (for experts) uu <- Const("pi", 16)# unaccurate str(uu) # very similar to just 'uu' } \keyword{utilities} Rmpfr/man/bind-methods.Rd0000644000175000017500000000341012772467643015131 0ustar nileshnilesh\name{bind-methods} \title{"mpfr" '...' - Methods for Functions cbind(), rbind()} \docType{methods} \alias{cbind} \alias{rbind} \alias{cbind-methods} \alias{rbind-methods} \alias{cbind,ANY-method} \alias{cbind,Mnumber-method} \alias{rbind,ANY-method} \alias{rbind,Mnumber-method} \description{ \code{\link{cbind}} and \code{\link{rbind}} methods for signature \code{...} (see \code{\link[methods]{dotsMethods}} are provided for class \code{\linkS4class{Mnumber}}, i.e., for binding numeric vectors and class \code{"\linkS4class{mpfr}"} vectors and matrices (\code{"\linkS4class{mpfrMatrix}"}) together. } \usage{ cbind(\dots, deparse.level = 1) rbind(\dots, deparse.level = 1) } \arguments{ \item{\dots}{matrix-/vector-like \R objects to be bound together, see the \pkg{base} documentation, \code{\link[base:cbind]{cbind}}. } \item{deparse.level}{integer determining under which circumstances column and row names are built from the actual arguments' \sQuote{expression}, see \code{\link{cbind}}.} } \section{Methods}{ \describe{ \item{... = "Mnumber"}{is used to (c|r)bind multiprecision \dQuote{numbers} (inheriting from class \code{"\linkS4class{mpfr}"}) together, maybe combined with simple numeric vectors.} \item{... = "ANY"}{reverts to \code{\link[base]{cbind}} and \code{rbind} from package \pkg{base}.} } } \value{ typically a \sQuote{matrix-like} object, here typically of \code{\link{class} "\linkS4class{mpfrMatrix}"}. } % \references{ ~put references to the literature/web site here ~ } \author{Martin Maechler} \seealso{\code{\link{cbind2}}, \code{\link{cbind}}, Documentation in base \R's \pkg{methods} package% R <= 3.3.1 \code{\link[methods]{Methods}} } \examples{ cbind(1, mpfr(6:3, 70)/7, 3:0) } \keyword{methods} Rmpfr/man/is.whole.Rd0000644000175000017500000000207011754461676014304 0ustar nileshnilesh\name{is.whole} \alias{is.whole.mpfr} \title{Whole ("Integer") Numbers} \description{ Check which elements of \code{x[]} are integer valued aka \dQuote{whole} numbers,including MPFR numbers (class \code{\linkS4class{mpfr}}). } \usage{ \S3method{is.whole}{mpfr}(x) } \arguments{ \item{x}{any \R vector, here of \code{\link{class}} \code{\linkS4class{mpfr}}.} } \value{ logical vector of the same length as \code{x}, indicating where \code{x[.]} is integer valued. } \author{Martin Maechler} \seealso{ \code{\link{is.integer}(x)} (\pkg{base} package) checks for the \emph{internal} mode or class, not if \code{x[i]} are integer valued. The \code{\link[gmp]{is.whole}()} methods in package \pkg{gmp}. } \examples{ is.integer(3) # FALSE, it's internally a double is.whole(3) # TRUE x <- c(as(2,"mpfr") ^ 100, 3, 3.2, 1000000, 2^40) is.whole(x) # one FALSE, only \dontshow{ xt <- c(x, as.bigz(2)^120, as.bigq(3,1:3)) stopifnot(identical(is.whole(x), (1:5)!=3), is(xt, "mpfr"), identical(is.whole(xt), is.na(match(1:9, c(3,8))))) }%dont } \keyword{math} Rmpfr/man/mpfrMatrix-class.Rd0000644000175000017500000002463713637431043016010 0ustar nileshnilesh\name{mpfrMatrix} \title{Classes "mpfrMatrix" and "mpfrArray"}% <--> ./mpfrArray.Rd \docType{class} \alias{mpfrMatrix-class} \alias{mpfrArray-class} % \alias{Arith,mpfrArray,mpfr-method} \alias{Arith,mpfrArray,mpfrArray-method} \alias{Arith,mpfr,mpfrArray-method} \alias{Arith,mpfrArray,numeric-method} \alias{Arith,numeric,mpfrArray-method} \alias{Compare,mpfrArray,mpfr-method} \alias{Compare,mpfrArray,numeric-method} \alias{Compare,mpfr,mpfrArray-method} \alias{Compare,numeric,mpfrArray-method} % \alias{apply,mpfrArray-method} \alias{colSums,mpfrArray-method} \alias{colMeans,mpfrArray-method} \alias{rowSums,mpfrArray-method} \alias{rowMeans,mpfrArray-method} \alias{as.vector,mpfrArray,missing-method} \alias{coerce,mpfrArray,array-method} \alias{coerce,array,mpfrArray-method} \alias{coerce,mpfrArray,matrix-method} \alias{coerce,mpfrMatrix,matrix-method} \alias{coerce,matrix,mpfrMatrix-method} %% the following two from the same setAs(); the 2nd one is auto-produced %% *and* needed by codoc(). Behavior seems a bit bogous : \alias{coerce,mpfrArray,vector-method} \alias{coerce<-,mpfrArray,vector-method} \alias{diag,mpfrMatrix-method} \alias{diag<-,mpfrMatrix-method} % \alias{[<-,mpfrArray,ANY,ANY,ANY-method} \alias{[<-,mpfrArray,ANY,ANY,mpfr-method} \alias{[<-,mpfrArray,ANY,missing,ANY-method} \alias{[<-,mpfrArray,ANY,missing,mpfr-method} \alias{[<-,mpfrArray,missing,ANY,ANY-method} \alias{[<-,mpfrArray,missing,ANY,mpfr-method} \alias{[<-,mpfrArray,missing,missing,ANY-method} \alias{[<-,mpfrArray,missing,missing,mpfr-method} \alias{[<-,mpfrArray,matrix,missing,ANY-method} \alias{[<-,mpfrArray,matrix,missing,mpfr-method} % \alias{[,mpfrArray,ANY,ANY,ANY-method} \alias{[,mpfrArray,ANY,missing,missing-method} \alias{[,mpfrArray,matrix,missing,missing-method} \alias{\%*\%,Mnumber,mpfr-method} \alias{\%*\%,mpfrMatrix,mpfr-method} \alias{\%*\%,mpfrMatrix,mpfrMatrix-method} \alias{\%*\%,mpfr,Mnumber-method} \alias{\%*\%,mpfr,mpfr-method} \alias{\%*\%,mpfr,mpfrMatrix-method} \alias{crossprod,mpfr,missing-method} \alias{crossprod,mpfrMatrix,mpfr-method} \alias{crossprod,mpfrMatrix,mpfrMatrix-method} \alias{crossprod,mpfr,Mnumber-method} \alias{crossprod,mpfr,mpfr-method} \alias{crossprod,mpfr,mpfrMatrix-method} \alias{crossprod,Mnumber,mpfr-method} \alias{tcrossprod,mpfr,missing-method} \alias{tcrossprod,mpfrMatrix,mpfr-method} \alias{tcrossprod,mpfrMatrix,mpfrMatrix-method} \alias{tcrossprod,mpfr,Mnumber-method} \alias{tcrossprod,mpfr,mpfr-method} \alias{tcrossprod,mpfr,mpfrMatrix-method} \alias{tcrossprod,Mnumber,mpfr-method} \alias{dim,mpfrArray-method} \alias{dimnames<-,mpfrArray-method} \alias{dimnames,mpfrArray-method} \alias{norm,ANY,missing-method} \alias{norm,mpfrMatrix,character-method} \alias{show,mpfrArray-method} \alias{sign,mpfrArray-method} \alias{t,mpfrMatrix-method} \alias{aperm,mpfrArray-method} % \description{The classes \code{"mpfrMatrix"} and \code{"mpfrArray"} are, analogously to the \pkg{base} \code{\link{matrix}} and \code{\link{array}} functions and classes simply \dQuote{numbers} of class \code{\linkS4class{mpfr}} with an additional \code{Dim} and \code{Dimnames} slot. } \section{Objects from the Class}{ Objects should typically be created by \code{\link{mpfrArray}()}, but can also be created by \code{new("mpfrMatrix", ...)} or \code{new("mpfrArray", ...)}, or also by \code{t(x)}, \code{dim(x) <- dd}, or \code{\link{mpfr2array}(x, dim=dd)} where \code{x} is a an \code{\linkS4class{mpfr}} \dQuote{number vector}. A (slightly more flexible) alternative to \code{dim(x) <- dd} is \code{\link{mpfr2array}(x, dd, dimnames)}. } \section{Slots}{ \describe{ \item{\code{.Data}:}{as for the \code{\linkS4class{mpfr}} class, a \code{"list"} of \code{\linkS4class{mpfr1}} numbers.} \item{\code{Dim}:}{of class \code{"integer"}, specifying the array dimension.} \item{\code{Dimnames}:}{of class \code{"list"} and the same length as \code{Dim}, each list component either \code{\link{NULL}} or a \code{\link{character}} vector of length \code{Dim[j]}.} } } \section{Extends}{ Class \code{"mpfrMatrix"} extends \code{"mpfrArray"}, directly. Class \code{"mpfrArray"} extends class \code{"\linkS4class{mpfr}"}, by class "mpfrArray", distance 2; class \code{"\linkS4class{list}"}, by class "mpfrArray", distance 3; class \code{"\linkS4class{vector}"}, by class "mpfrArray", distance 4. } \section{Methods}{ \describe{ \item{Arith}{\code{signature(e1 = "mpfr", e2 = "mpfrArray")}: ... } \item{Arith}{\code{signature(e1 = "numeric", e2 = "mpfrArray")}: ... } \item{Arith}{\code{signature(e1 = "mpfrArray", e2 = "mpfrArray")}: ... } \item{Arith}{\code{signature(e1 = "mpfrArray", e2 = "mpfr")}: ... } \item{Arith}{\code{signature(e1 = "mpfrArray", e2 = "numeric")}: ... } \item{as.vector}{\code{signature(x = "mpfrArray", mode = "missing")}: drops the dimension \sQuote{attribute}, i.e., transforms \code{x} into a simple \code{\linkS4class{mpfr}} vector. This is an inverse of \code{t(.)} or \code{dim(.) <- *} on such a vector.} \item{atan2}{\code{signature(y = "ANY", x = "mpfrArray")}: ... } \item{atan2}{\code{signature(y = "mpfrArray", x = "mpfrArray")}: ... } \item{atan2}{\code{signature(y = "mpfrArray", x = "ANY")}: ... } \item{[<-}{\code{signature(x = "mpfrArray", i = "ANY", j = "ANY", value = "ANY")}: ... } \item{[}{\code{signature(x = "mpfrArray", i = "ANY", j = "ANY", drop = "ANY")}: ... } \item{[}{\code{signature(x = "mpfrArray", i = "ANY", j = "missing", drop = "missing")}: \code{"mpfrArray"}s can be subset (\dQuote{indexed}) as regular \R \code{\link{array}}s.} \item{\%*\%}{\code{signature(x = "mpfr", y = "mpfrMatrix")}: Compute the matrix/vector product \eqn{x y} when the dimensions (\code{\link{dim}}) of \code{x} and \code{y} match. If \code{x} is not a matrix, it is treated as a 1-row or 1-column matrix (aka \dQuote{row vector} or \dQuote{column vector}) depending on which one makes sense, see the documentation of the \pkg{base} function \code{\link[base:matmult]{\%*\%}}.} \item{\%*\%}{\code{signature(x = "mpfr", y = "Mnumber")}: method definition for cases with one \code{\linkS4class{mpfr}} and any \dQuote{number-like} argument are to use MPFR arithmetic as well.} \item{\%*\%}{\code{signature(x = "mpfrMatrix", y = "mpfrMatrix")},} \item{\%*\%}{\code{signature(x = "mpfrMatrix", y = "mpfr")}, etc. Further method definitions with identical semantic.} \item{crossprod}{\code{signature(x = "mpfr", y = "missing")}: Computes \eqn{x'x}, i.e., \code{t(x) \%*\% x}, typically more efficiently.} \item{crossprod}{\code{signature(x = "mpfr", y = "mpfrMatrix")}: Computes \eqn{x'y}, i.e., \code{t(x) \%*\% y}, typically more efficiently.} \item{crossprod}{\code{signature(x = "mpfrMatrix", y = "mpfrMatrix")}: ... } \item{crossprod}{\code{signature(x = "mpfrMatrix", y = "mpfr")}: ... } \item{tcrossprod}{\code{signature(x = "mpfr", y = "missing")}: Computes \eqn{xx'}, i.e., \code{x \%*\% t(x)}, typically more efficiently.} \item{tcrossprod}{\code{signature(x = "mpfrMatrix", y = "mpfrMatrix")}: Computes \eqn{xy'}, i.e., \code{x \%*\% t(y)}, typically more efficiently.} \item{tcrossprod}{\code{signature(x = "mpfrMatrix", y = "mpfr")}: ... } \item{tcrossprod}{\code{signature(x = "mpfr", y = "mpfrMatrix")}: ... } \item{coerce}{\code{signature(from = "mpfrArray", to = "array")}: coerces \code{from} to a \emph{numeric} array of the same dimension.} \item{coerce}{\code{signature(from = "mpfrArray", to = "vector")}: as for standard \code{\link{array}}s, this \dQuote{drops} the \code{dim} (and \code{dimnames}), i.e., returns an \code{\linkS4class{mpfr}} vector.} \item{Compare}{\code{signature(e1 = "mpfr", e2 = "mpfrArray")}: ... } \item{Compare}{\code{signature(e1 = "numeric", e2 = "mpfrArray")}: ... } \item{Compare}{\code{signature(e1 = "mpfrArray", e2 = "mpfr")}: ... } \item{Compare}{\code{signature(e1 = "mpfrArray", e2 = "numeric")}: ... } \item{dim}{\code{signature(x = "mpfrArray")}: ... } \item{dimnames<-}{\code{signature(x = "mpfrArray")}: ... } \item{dimnames}{\code{signature(x = "mpfrArray")}: ... } \item{show}{\code{signature(object = "mpfrArray")}: ... } \item{sign}{\code{signature(x = "mpfrArray")}: ... } \item{norm}{\code{signature(x = "mpfrMatrix", type = "character")}: computes the matrix norm of \code{x}, see \code{\link[base]{norm}} or the one in package \pkg{Matrix}.} \item{t}{\code{signature(x = "mpfrMatrix")}: tranpose the mpfrMatrix.} \item{aperm}{\code{signature(a = "mpfrArray")}: \code{aperm(a, perm)} is a generalization of \code{t(.)} to \emph{perm}ute the dimensions of an mpfrArray; it has the same semantics as the standard \code{\link{aperm}()} method for simple \R \code{\link{array}}s.} } } \author{Martin Maechler} \seealso{ \code{\link{mpfrArray}}, also for more examples. } \examples{ showClass("mpfrMatrix") validObject(mm <- new("mpfrMatrix")) validObject(aa <- new("mpfrArray")) v6 <- mpfr(1:6, 128) m6 <- new("mpfrMatrix", v6, Dim = c(2L, 3L)) validObject(m6) m6 which(m6 == 3, arr.ind = TRUE) # |--> (1, 2) ## Coercion back to "vector": Both of these work: stopifnot(identical(as(m6, "mpfr"), v6), identical(as.vector(m6), v6)) # < but this is a "coincidence" S2 <- m6[,-3] # 2 x 2 S3 <- rbind(m6, c(1:2,10)) ; s3 <- asNumeric(S3) det(S2) str(determinant(S2)) det(S3) stopifnot(all.equal(det(S2), det(asNumeric(S2)), tol=1e-15), all.equal(det(S3), det(s3), tol=1e-15)) ## 2-column matrix indexing and replacement: (sS <- S3[i2 <- cbind(1:2, 2:3)]) stopifnot(identical(asNumeric(sS), s3[i2])) C3 <- S3; c3 <- s3 C3[i2] <- 10:11 c3[i2] <- 10:11 stopifnot(identical(asNumeric(C3), c3)) AA <- new("mpfrArray", as.vector(cbind(S3, -S3)), Dim=c(3L,3:2)) stopifnot(identical(AA[,,1] , S3), identical(AA[,,2] , -S3)) aa <- asNumeric(AA) i3 <- cbind(3:1, 1:3, c(2L, 1:2)) ii3 <- Rmpfr:::.mat2ind(i3, dim(AA), dimnames(AA)) stopifnot(aa[i3] == new("mpfr", getD(AA)[ii3])) stopifnot(identical(aa[i3], asNumeric(AA[i3]))) CA <- AA; ca <- aa ca[i3] <- ca[i3] ^ 3 CA[i3] <- CA[i3] ^ 3 ## scale(): S2. <- scale(S2) stopifnot(all.equal(abs(as.vector(S2.)), rep(sqrt(1/mpfr(2, 128)), 4), tol = 1e-30)) ## norm() : norm(S2) stopifnot(identical(norm(S2), norm(S2, "1")), norm(S2, "I") == 6, norm(S2, "M") == 4, abs(norm(S2, "F") - 5.477225575051661) < 1e-15) } \keyword{classes} Rmpfr/man/gmp-conversions.Rd0000644000175000017500000000360012352053702015663 0ustar nileshnilesh\name{gmp-conversions} \alias{.bigq2mpfr} \alias{.bigz2mpfr} \alias{.mpfr2bigz} \alias{coerce,bigq,mpfr-method} \alias{coerce,bigz,mpfr-method} \title{Conversion Utilities gmp <-> Rmpfr} \description{ Coerce from and to big integers (\code{\link[gmp]{bigz}}) and \code{\link{mpfr}} numbers. Further, coerce from big rationals (\code{\link[gmp]{bigq}}) to \code{\link{mpfr}} numbers. } \usage{ .bigz2mpfr(x, precB = NULL, rnd.mode = c('N','D','U','Z','A')) .bigq2mpfr(x, precB = NULL, rnd.mode = c('N','D','U','Z','A')) .mpfr2bigz(x, mod = NA) % as(x, "mpfr") } \arguments{ \item{x}{an \R object of class \code{bigz}, \code{bigq} or \code{mpfr} respectively.} \item{precB}{precision in bits for the result. The default, \code{NULL}, means to use the \emph{minimal} precision necessary for correct representation.} \item{rnd.mode}{a 1-letter string specifying how \emph{rounding} should happen at C-level conversion to MPFR, see details of \code{\link{mpfr}}.} \item{mod}{a possible modulus, see \code{\link[gmp]{as.bigz}} in package \pkg{gmp}.} } \details{ Note that we also provide the natural (S4) coercions, \code{as(x, "mpfr")} for \code{x} inheriting from class \code{"bigz"} or \code{"bigq"}. } \value{ a numeric vector of the same length as \code{x}, of the desired class. } \seealso{ \code{\link{mpfr}()}, \code{\link[gmp]{as.bigz}} and \code{\link[gmp]{as.bigq}} in package \pkg{gmp}. } \examples{ S <- gmp::Stirling2(50,10) show(S) SS <- S * as.bigz(1:3)^128 stopifnot(all.equal(log2(SS[2]) - log2(S), 128, tolerance=1e-15), identical(SS, .mpfr2bigz(.bigz2mpfr(SS)))) .bigz2mpfr(S) # 148 bit precision .bigz2mpfr(S, precB=256) # 256 bit ## rational --> mpfr: sq <- SS / as.bigz(2)^100 MP <- as(sq, "mpfr") stopifnot(identical(MP, .bigq2mpfr(sq)), SS == MP * as(2, "mpfr")^100) } \keyword{arith}% <- or better ? Rmpfr/man/mpfr-class.Rd0000644000175000017500000004652413572235061014622 0ustar nileshnilesh\name{mpfr-class} \docType{class} \title{Class "mpfr" of Multiple Precision Floating Point Numbers} % \alias{mpfr-class} \alias{mpfr1-class} \alias{summaryMpfr-class} % \alias{[[,mpfr-method} \alias{[,mpfr,ANY,missing,missing-method} \alias{[<-,mpfr,missing,missing,ANY-method} \alias{[<-,mpfr,ANY,missing,ANY-method} \alias{[<-,mpfr,ANY,missing,mpfr-method} % FIXME: many of these are just \alias{}ed, but *NOT* documented: \alias{as.numeric,mpfr-method} \alias{as.vector,mpfrArray-method} \alias{as.integer,mpfr-method} \alias{beta,ANY,mpfr-method} \alias{beta,ANY,mpfrArray-method} \alias{beta,mpfr,ANY-method} \alias{beta,mpfr,mpfr-method} \alias{beta,mpfr,numeric-method} \alias{beta,numeric,mpfr-method} \alias{beta,mpfrArray,ANY-method} \alias{beta,mpfrArray,mpfrArray-method} \alias{lbeta,ANY,mpfr-method} \alias{lbeta,ANY,mpfrArray-method} \alias{lbeta,mpfr,ANY-method} \alias{lbeta,mpfr,mpfr-method} \alias{lbeta,mpfr,numeric-method} \alias{lbeta,numeric,mpfr-method} \alias{lbeta,mpfrArray,ANY-method} \alias{lbeta,mpfrArray,mpfrArray-method} \alias{atan2,ANY,mpfr-method} \alias{atan2,ANY,mpfrArray-method} \alias{atan2,mpfr,ANY-method} \alias{atan2,mpfr,mpfr-method} \alias{atan2,mpfr,numeric-method} \alias{atan2,numeric,mpfr-method} \alias{atan2,mpfrArray,ANY-method} \alias{atan2,mpfrArray,mpfrArray-method} \alias{hypot} % \alias{coerce,mpfr,character-method} \alias{coerce,mpfr,numeric-method} \alias{coerce,mpfr,bigz-method} \alias{coerce,mpfr,integer-method} \alias{coerce,mpfr1,numeric-method} \alias{coerce,mpfr1,mpfr-method} \alias{coerce,integer,mpfr-method} \alias{coerce,logical,mpfr-method} \alias{coerce,raw,mpfr-method} \alias{coerce,numeric,mpfr-method} \alias{coerce,numeric,mpfr1-method} \alias{coerce,array,mpfr-method} \alias{coerce,character,mpfr-method} \alias{coerce,mpfr,mpfr1-method} % \alias{Ops,mpfr,ANY-method} \alias{Ops,ANY,mpfr-method} \alias{Ops,mpfr,bigq-method} \alias{Ops,bigq,mpfr-method} \alias{Ops,mpfr,bigz-method} \alias{Ops,bigz,mpfr-method} \alias{Ops,array,mpfr-method} \alias{Ops,mpfr,array-method} \alias{Ops,mpfr,vector-method} \alias{Ops,vector,mpfr-method} \alias{Arith,mpfr,array-method} \alias{Arith,mpfr,missing-method} \alias{Arith,mpfr,mpfr-method} \alias{Arith,mpfr,integer-method} \alias{Arith,mpfr,numeric-method} \alias{Arith,integer,mpfr-method} \alias{Arith,numeric,mpfr-method} \alias{Arith,array,mpfr-method} % \alias{Compare,mpfr,mpfr-method} \alias{Compare,mpfr,integer-method} \alias{Compare,mpfr,numeric-method} \alias{Compare,integer,mpfr-method} \alias{Compare,numeric,mpfr-method} \alias{Compare,mpfr,array-method} \alias{Compare,array,mpfr-method} % \alias{Logic,mpfr,mpfr-method} \alias{Logic,mpfr,numeric-method} \alias{Logic,numeric,mpfr-method} \alias{Summary,mpfr-method} \alias{Math,mpfr-method} \alias{Math2,mpfr-method} \alias{abs,mpfr-method} \alias{log,mpfr-method} \alias{factorial,mpfr-method} \alias{sign,mpfr-method} % "Complex" (cheap methods for "real"s): \alias{Re,mpfr-method} \alias{Im,mpfr-method} \alias{Mod,mpfr-method} \alias{Arg,mpfr-method} \alias{Conj,mpfr-method} \alias{format,mpfr-method} \alias{is.finite,mpfr-method} \alias{is.infinite,mpfr-method} \alias{is.na,mpfr-method} \alias{is.nan,mpfr-method} \alias{is.finite,mpfrArray-method} \alias{is.infinite,mpfrArray-method} \alias{is.na,mpfrArray-method} \alias{is.nan,mpfrArray-method} \alias{unique,mpfr-method}% <--- wanted by R CMD check \alias{unique,mpfr,ANY-method}% not sufficient for R CMD .. \alias{unique.mpfr} % \alias{all.equal,mpfr,mpfr-method} \alias{all.equal,mpfr,ANY-method} \alias{all.equal,ANY,mpfr-method} \alias{mean,mpfr-method} \alias{median,mpfr-method} \alias{quantile,mpfr-method} \alias{summary,mpfr-method} \alias{dim<-,mpfr-method} \alias{t,mpfr-method} \alias{\%*\%,array_or_vector,mpfr-method} \alias{\%*\%,mpfr,array_or_vector-method} \alias{crossprod,array_or_vector,mpfr-method} \alias{crossprod,mpfr,array_or_vector-method} \alias{tcrossprod,array_or_vector,mpfr-method} \alias{tcrossprod,mpfr,array_or_vector-method} \alias{which.min,mpfr-method} \alias{which.max,mpfr-method} \alias{show,mpfr-method} \alias{show,mpfr1-method} \alias{show,summaryMpfr-method} \alias{print.mpfr1} \alias{print.summaryMpfr} % \description{ \code{"mpfr"} is the class of \bold{M}ultiple \bold{P}recision \bold{F}loatingpoint numbers with \bold{R}eliable arithmetic. sFor the high-level user, \code{"mpfr"} objects should behave as standard \R's \code{\link{numeric}} \emph{vectors}. They would just print differently and use the prespecified (typically high) precision instead of the double precision of \sQuote{traditional} \R numbers (with \code{\link{class}(.) == "numeric"} and \code{\link{typeof}(.) == "double"}). \code{hypot(x,y)} computes the hypothenuse length \eqn{z} in a rectangular triangle with \dQuote{leg} side lengths \eqn{x} and \eqn{y}, i.e., \deqn{z = hypot(x,y) = \sqrt{x^2 + y^2},}{z = hypot(x,y) = sqrt(x^2 + y^2),} in a numerically stable way. } \usage{ hypot(x,y, rnd.mode = c("N","D","U","Z","A")) } \arguments{ \item{x,y}{an object of class \code{mpfr}.} \item{rnd.mode}{a 1-letter string specifying how \emph{rounding} should happen at C-level conversion to MPFR, see \code{\link{mpfr}}.} } \section{Objects from the Class}{ Objects are typically created by \code{\link{mpfr}(, precBits)}. \code{summary()} returns an object of class \code{"summaryMpfr"} which contains \code{"mpfr"} but has its own \code{\link{print}} method. } \section{Slots}{ Internally, \code{"mpfr"} objects just contain standard \R \code{\link{list}}s where each list element is of class \code{"mpfr1"}, representing \emph{one} MPFR number, in a structure with four slots, very much parallelizing the C \code{struc} in the \code{mpfr} C library to which the \pkg{Rmpfr} package interfaces. An object of class \code{"mpfr1"} has slots \describe{ \item{\code{prec}:}{\code{"integer"} specifying the maxmimal precision in \bold{bits}.} \item{\code{exp}:}{\code{"integer"} specifying the base-\bold{2} exponent of the number.} \item{\code{sign}:}{\code{"integer"}, typically \code{-1} or \code{1}, specifying the sign (i.e. \code{\link{sign}(.)}) of the number.} \item{\code{d}:}{an \code{"integer"} vector (of 32-bit \dQuote{limbs}) which corresponds to the full mantissa of the number.} }% desc } % \section{Extends}{ % Class \code{"\linkS4class{list}"}, from data part. % Class \code{"\linkS4class{vector}"}, by class "list", distance 2. % } \section{Methods}{ \describe{ \item{abs}{\code{signature(x = "mpfr")}: ... } \item{atan2}{\code{signature(y = "mpfr", x = "ANY")}, and} \item{atan2}{\code{signature(x = "ANY", y = "mpfr")}: compute the arc-tangent of two arguments: \code{atan2(y, x)} returns the angle between the x-axis and the vector from the origin to \eqn{(x, y)}, i.e., for positive arguments \code{atan2(y, x) == \link{atan}(y/x)}.} \item{lbeta}{\code{signature(a = "ANY", b = "mpfrArray")}, is \eqn{\log(|B(a,b)|)}{log(abs(B(a,b)))} where \eqn{B(a,b)} is the Beta function, \code{beta(a,b)}.} \item{beta}{\code{signature(a = "mpfr", b = "ANY")},} \item{beta}{\code{signature(a = "mpfr", b = "mpfr")}, \dots, etc: Compute the beta function \eqn{B(a,b)}, using high precision, building on internal \code{\link{gamma}} or \code{\link{lgamma}}. See the help for \R's base function \code{\link[base]{beta}} for more. Currently, there, \eqn{a,b \ge 0}{a,b >= 0} is required. Here, we provide (non-\code{\link{NaN}}) for all numeric \code{a, b}. When either \eqn{a}, \eqn{b}, or \eqn{a+b} is a negative \emph{integer}, \eqn{\Gamma(.)} has a pole there and is undefined (\code{NaN}). However the Beta function can be defined there as \dQuote{limit}, in some cases. Following other software such as SAGE, Maple or Mathematica, we provide finite values in these cases. However, note that these are not proper limits (two-dimensional in \eqn{(a,b)}), but useful for some applications. E.g., \eqn{B(a,b)} is defined as zero when \eqn{a+b} is a negative integer, but neither \eqn{a} nor \eqn{b} is. Further, if \eqn{a > b > 0} are integers, \eqn{B(-a,b)= B(b,-a)} can be seen as \eqn{(-1)^b * B(a-b+1,b)}. } \item{dim<-}{\code{signature(x = "mpfr")}: Setting a dimension \code{\link{dim}} on an \code{"mpfr"} object makes it into an object of class \code{"\linkS4class{mpfrArray}"} or (more specifically) \code{"mpfrMatrix"} for a length-2 dimension, see their help page; note that \code{t(x)} (below) is a special case of this.} \item{Ops}{\code{signature(e1 = "mpfr", e2 = "ANY")}: ... } \item{Ops}{\code{signature(e1 = "ANY", e2 = "mpfr")}: ... } \item{Arith}{\code{signature(e1 = "mpfr", e2 = "missing")}: ... } \item{Arith}{\code{signature(e1 = "mpfr", e2 = "mpfr")}: ... } \item{Arith}{\code{signature(e1 = "mpfr", e2 = "integer")}: ... } \item{Arith}{\code{signature(e1 = "mpfr", e2 = "numeric")}: ... } \item{Arith}{\code{signature(e1 = "integer", e2 = "mpfr")}: ... } \item{Arith}{\code{signature(e1 = "numeric", e2 = "mpfr")}: ... } \item{Compare}{\code{signature(e1 = "mpfr", e2 = "mpfr")}: ... } \item{Compare}{\code{signature(e1 = "mpfr", e2 = "integer")}: ... } \item{Compare}{\code{signature(e1 = "mpfr", e2 = "numeric")}: ... } \item{Compare}{\code{signature(e1 = "integer", e2 = "mpfr")}: ... } \item{Compare}{\code{signature(e1 = "numeric", e2 = "mpfr")}: ... } \item{Logic}{\code{signature(e1 = "mpfr", e2 = "mpfr")}: ... } \item{Summary}{\code{signature(x = "mpfr")}: The S4 \code{\link[methods:S4groupGeneric]{Summary}} group functions, \code{\link{max}}, \code{\link{min}}, \code{\link{range}}, \code{\link{prod}}, \code{\link{sum}}, \code{\link{any}}, and \code{\link{all}} are all defined for MPFR numbers. \code{\link{mean}(x, trim)} for non-0 \code{trim} works analogously to \code{\link{mean.default}}.} \item{median}{\code{signature(x = "mpfr")}: works via}% quantile(*, probs = 0.5) : \item{quantile}{\code{signature(x = "mpfr")}: a simple wrapper of the \code{quantile.default} method from \pkg{stats}.} \item{summary}{\code{signature(object = "mpfr")}: modeled after \code{\link{summary.default}}, ensuring to provide the full "mpfr" range of numbers.} \item{Math}{\code{signature(x = "mpfr")}: All the S4 \code{\link[methods:S4groupGeneric]{Math}} group functions are defined, using multiple precision (MPFR) arithmetic, from \code{\link{getGroupMembers}("Math")}, these are (in alphabetical order): \code{\link{abs}}, \code{\link{sign}}, \code{\link{sqrt}}, \code{\link{ceiling}}, \code{\link{floor}}, \code{\link{trunc}}, \code{\link{cummax}}, \code{\link{cummin}}, \code{\link{cumprod}}, \code{\link{cumsum}}, \code{\link{exp}}, \code{\link{expm1}}, \code{\link{log}}, \code{\link{log10}}, \code{\link{log2}}, \code{\link{log1p}}, \code{\link{cos}}, \code{\link{cosh}}, \code{\link{sin}}, \code{\link{sinh}}, \code{\link{tan}}, \code{\link{tanh}}, \code{\link{acos}}, \code{\link{acosh}}, \code{\link{asin}}, \code{\link{asinh}}, \code{\link{atan}}, \code{\link{atanh}}, \code{\link{gamma}}, \code{\link{lgamma}}, \code{\link{digamma}}, and \code{\link{trigamma}}. Currently, \code{trigamma} is not provided by the MPFR library and hence not yet implemented. \cr Further, the \code{cum*()} methods are \emph{not yet} implemented.} \item{factorial}{\code{signature(x = "mpfr")}: this will \code{\link{round}} the result when \code{x} is integer valued. Note however that \code{\link{factorialMpfr}(n)} for integer \code{n} is slightly more efficient, using the MPFR function \samp{mpfr_fac_ui}.} \item{Math2}{\code{signature(x = "mpfr")}: \code{\link{round}(x, digits)} and \code{\link{signif}(x, digits)} methods. Note that these do not change the formal precision (\code{'prec'} slot), and you may often want to apply \code{\link{roundMpfr}()} in addition or preference.} \item{as.numeric}{\code{signature(x = "mpfr")}: ... } \item{as.vector}{\code{signature(x = "mpfrArray")}: as for standard \code{\link{array}}s, this \dQuote{drops} the \code{dim} (and \code{dimnames}), i.e., transforms \code{x} into an \sQuote{MPFR} number vector, i.e., class \code{\linkS4class{mpfr}}.} \item{[[}{\code{signature(x = "mpfr", i = "ANY")}, and} \item{[}{\code{signature(x = "mpfr", i = "ANY", j = "missing", drop = "missing")}: subsetting aka \dQuote{indexing} happens as for numeric vectors.} \item{format}{\code{signature(x = "mpfr")}, further arguments \code{digits = NULL, scientific = NA}, etc: returns \code{\link{character}} vector of same length as \code{x}; when \code{digits} is \code{NULL}, with \emph{enough} digits to recreate \code{x} accurately. For details, see \code{\link{formatMpfr}}.} \item{is.finite}{\code{signature(x = "mpfr")}: ... } \item{is.infinite}{\code{signature(x = "mpfr")}: ... } \item{is.na}{\code{signature(x = "mpfr")}: ... } \item{is.nan}{\code{signature(x = "mpfr")}: ... } \item{log}{\code{signature(x = "mpfr")}: ... } \item{show}{\code{signature(object = "mpfr")}: ... } \item{sign}{\code{signature(x = "mpfr")}: ... } \item{Re, Im}{\code{signature(z = "mpfr")}: simply return \code{z} or \code{0} (as \code{"mpfr"} numbers of correct precision), as mpfr numbers are \sQuote{real} numbers.} \item{Arg, Mod, Conj}{\code{signature(z = "mpfr")}: these are trivial for our \sQuote{real} mpfr numbers, but defined to work correctly when used in \R code that also allows complex number input.} \item{all.equal}{\code{signature(target = "mpfr", current = "mpfr")},} \item{all.equal}{\code{signature(target = "mpfr", current = "ANY")}, and} \item{all.equal}{\code{signature(target = "ANY", current = "mpfr")}: methods for numerical (approximate) equality, \code{\link[base]{all.equal}} of multiple precision numbers. Note that the default \code{tolerance} (argument) is taken to correspond to the (smaller of the two) precisions when both main arguments are of class \code{"mpfr"}, and hence can be considerably less than double precision machine epsilon \code{\link{.Machine}$double.eps}.} \item{coerce}{\code{signature(from = "numeric", to = "mpfr")}: \code{\link{as}(., "mpfr")} coercion methods are available for \code{\link{character}} strings, \code{\link{numeric}}, \code{\link{integer}}, \code{\link{logical}}, and even \code{\link{raw}}. Note however, that \code{\link{mpfr}(., precBits, base)} is more flexible.} \item{coerce}{\code{signature(from = "mpfr", to = "bigz")}: coerces to biginteger, see \code{\link[gmp]{bigz}} in package \pkg{gmp}.} \item{coerce}{\code{signature(from = "mpfr", to = "numeric")}: ... } \item{coerce}{\code{signature(from = "mpfr", to = "character")}: ... } \item{unique}{\code{signature(x = "mpfr")}, and corresponding S3 method (such that \code{unique()} works inside \pkg{base} functions), see \code{\link{unique}}. Note that \code{\link{duplicated}()} works for \code{"mpfr"} objects without the need for a specific method.} \item{t}{\code{signature(x = "mpfr")}: makes \code{x} into an \eqn{n \times 1}{n x 1} \code{\linkS4class{mpfrMatrix}}.} \item{which.min}{\code{signature(x = "mpfr")}: gives the index of the first minimum, see \code{\link{which.min}}.} \item{which.max}{\code{signature(x = "mpfr")}: gives the index of the first maximum, see \code{\link{which.max}}.} } } \author{Martin Maechler} \note{Many more methods (\dQuote{functions}) automagically work for \code{"mpfr"} number vectors (and matrices, see the \code{\linkS4class{mpfrMatrix}} class doc), notably \code{\link{sort}}, \code{\link{order}}, \code{\link{quantile}}, \code{\link{rank}}. } \seealso{ The \code{"\linkS4class{mpfrMatrix}"} class, which extends the \code{"mpfr"} one. \code{\link{roundMpfr}} to \emph{change} precision of an \code{"mpfr"} object which is typically desirable \emph{instead} of or in addition to \code{signif()} or \code{round()}; \code{\link{is.whole}()} etc. Special mathematical functions such as some Bessel ones, e.g., \code{\link{jn}}; further, \code{\link{zeta}(.)} \eqn{(= \zeta(.))}, \code{Ei()} etc. \code{\link{Bernoulli}} numbers and the Pochhammer function \code{\link{pochMpfr}}. } \examples{ ## 30 digit precision str(x <- mpfr(c(2:3, pi), prec = 30 * log2(10))) x^2 x[1] / x[2] # 0.66666... ~ 30 digits ## indexing - as with numeric vectors stopifnot(identical(x[2], x[[2]]), ## indexing "outside" gives NA (well: "mpfr-NaN" for now): is.na(x[5]), ## whereas "[[" cannot index outside: is(try(x[[5]]), "try-error"), ## and only select *one* element: is(try(x[[2:3]]), "try-error")) ## factorial() & lfactorial would work automagically via [l]gamma(), ## but factorial() additionally has an "mpfr" method which rounds f200 <- factorial(mpfr(200, prec = 1500)) # need high prec.! f200 as.numeric(log2(f200))# 1245.38 -- need precBits >~ 1246 for full precision ##--> see factorialMpfr() for more such computations. ##--- "Underflow" **much** later -- exponents have 30(+1) bits themselves: mpfr.min.exp2 <- - (2^30 + 1) two <- mpfr(2, 55) stopifnot(two ^ mpfr.min.exp2 == 0) ## whereas two ^ (mpfr.min.exp2 * (1 - 1e-15)) ## 2.38256490488795107e-323228497 ["typically"] ##--- "Assert" that {sort}, {order}, {quantile}, {rank}, all work : p <- mpfr(rpois(32, lambda=500), precBits=128)^10 np <- as.numeric(log(p)) (sp <- summary(p))# using the print.summaryMpfr() method stopifnot(all(diff(sort(p)) >= 0), identical(order(p), order(np)), identical(rank (p), rank (np)), all.equal(sapply(1:9, function(Typ) quantile(np, type=Typ, names=FALSE)), sapply(lapply(1:9, function(Typ) quantile( p, type=Typ, names=FALSE)), function(x) as.numeric(log(x))), tol = 1e-3),# quantiles: interpolated in orig. <--> log scale TRUE) m0 <- mpfr(numeric(), 99) xy <- expand.grid(x = -2:2, y = -2:2) ; x <- xy[,"x"] ; y <- xy[,"y"] a2. <- atan2(y,x) stopifnot(identical(which.min(m0), integer(0)), identical(which.max(m0), integer(0)), all.equal(a2., atan2(as(y,"mpfr"), x)), max(m0) == mpfr(-Inf, 53), # (53 is not a feature, but ok) min(m0) == mpfr(+Inf, 53), sum(m0) == 0, prod(m0) == 1) ## unique(), now even base::factor() "works" on : set.seed(17) p <- rlnorm(20) * mpfr(10, 100)^-999 pp <- sample(p, 50, replace=TRUE) str(unique(pp)) # length 18 .. (from originally 20) ## Class 'mpfr' [package "Rmpfr"] of length 18 and precision 100 ## 5.56520587824e-999 4.41636588227e-1000 .. facp <- factor(pp) str(facp) # the factor *levels* are a bit verbose : # Factor w/ 18 levels "new(\"mpfr1\", ...........)" ... # At least *some* factor methods work : stopifnot(exprs = { is.factor(facp) identical(unname(table(facp)), unname(table(asNumeric(pp * mpfr(10,100)^1000)))) }) ## ((unfortunately, the expressions are wrong; should integer "L")) # ## More useful: levels with which to *invert* factor() : ## -- this is not quite ok: ## simplified from 'utils' : deparse1 <- function(x, ...) paste(deparse(x, 500L, ...), collapse = " ") if(FALSE) { str(pp.levs <- vapply(unclass(sort(unique(pp))), deparse1, "")) facp2 <- factor(pp, levels = pp.levs) } } \keyword{classes} Rmpfr/man/pbetaI.Rd0000644000175000017500000001235613735061520013751 0ustar nileshnilesh\name{pbetaI} \alias{pbetaI} \title{Accurate Incomplete Beta / Beta Probabilities For Integer Shapes} \description{ For integers \eqn{a}, \eqn{b}, \eqn{I_x(a,b)}{I(x; a,b)} aka \code{pbeta(x, a,b)} is a polynomial in x with rational coefficients, and hence arbitarily accurately computable. } \usage{ pbetaI(q, shape1, shape2, ncp = 0, lower.tail = TRUE, log.p = FALSE, precBits = NULL, useRational = !log.p && !is.mpfr(q) && is.null(precBits), rnd.mode = c("N","D","U","Z","A")) } \arguments{ \item{q}{called \eqn{x}, above; vector of quantiles, in \eqn{[0,1]}; can be \code{\link{numeric}}, or of class \code{"\link{mpfr}"} or also \code{"\link[gmp]{bigq}"} (\dQuote{big rational} from package \CRANpkg{gmp}); in the latter case, if \code{log.p = FALSE} as by default, \emph{all computations} are exact, using big rational arithmetic.} \item{shape1, shape2}{the positive Beta \dQuote{shape} parameters, called \eqn{a, b}, above. \bold{Must} be integer valued for this function.} \item{ncp}{unused, only for compatibility with \code{\link{pbeta}}, must be kept at its default, 0.} \item{lower.tail}{logical; if TRUE (default), probabilities are \eqn{P[X \le x]}, otherwise, \eqn{P[X > x]}.} \item{log.p}{logical; if TRUE, probabilities p are given as log(p).} \item{precBits}{the precision (in number of bits) to be used in \code{\link{sumBinomMpfr}()}.} \item{useRational}{optional \code{\link{logical}}, specifying if we should try to do everything in exact \emph{rational arithmetic}, i.e, using package \CRANpkg{gmp} functionality only, and return \code{\link{bigq}} numbers instead of \code{\link{mpfr}} numbers.} \item{rnd.mode}{a 1-letter string specifying how \emph{rounding} should happen at C-level conversion to MPFR, see \code{\link{mpfr}}.} } \value{ an \code{"\linkS4class{mpfr}"} vector of the same length as \code{q}. } \note{For upper tail probabilities, i.e., when \code{lower.tail=FALSE}, we may need large \code{precBits}, because the implicit or explicit \eqn{1 - P} computation suffers from severe cancellation. %% FIXME: Indeed, we may want to %% 1) determine a smart default precBits there %% 2) produce a warning when cancellation is in the same order as precBits } %% \references{ %% %% ~put references to the literature/web site here ~ %% } \author{Martin Maechler} \seealso{ \code{\link{pbeta}}, \code{\link{sumBinomMpfr}} \code{\link[gmp]{chooseZ}}. } \examples{ x <- (0:12)/16 # not all the way up .. a <- 7; b <- 788 p. <- pbetaI(x, a, b) ## a bit slower: system.time( pp <- pbetaI(x, a, b, precBits = 2048) ) # 0.23 -- 0.50 sec ## Currently, the lower.tail=FALSE are computed "badly": lp <- log(pp) ## = pbetaI(x, a, b, log.p=TRUE) lIp <- log1p(-pp) ## = pbetaI(x, a, b, lower.tail=FALSE, log.p=TRUE) Ip <- 1 - pp ## = pbetaI(x, a, b, lower.tail=FALSE) if(Rmpfr:::doExtras()) { ## somewhat slow stopifnot( all.equal(lp, pbetaI(x, a, b, precBits = 2048, log.p=TRUE)), all.equal(lIp, pbetaI(x, a, b, precBits = 2048, lower.tail=FALSE, log.p=TRUE), tol = 1e-230), all.equal( Ip, pbetaI(x, a, b, precBits = 2048, lower.tail=FALSE)) ) } rErr <- function(approx, true, eps = 1e-200) { true <- as.numeric(true) # for "mpfr" ifelse(Mod(true) >= eps, ## relative error, catching '-Inf' etc : ifelse(true == approx, 0, 1 - approx / true), ## else: absolute error (e.g. when true=0) true - approx) } rErr(pbeta(x, a, b), pp) rErr(pbeta(x, a, b, lower=FALSE), Ip) rErr(pbeta(x, a, b, log = TRUE), lp) rErr(pbeta(x, a, b, lower=FALSE, log = TRUE), lIp) a.EQ <- function(..., tol=1e-15) all.equal(..., tolerance=tol) stopifnot( a.EQ(pp, pbeta(x, a, b)), a.EQ(lp, pbeta(x, a, b, log.p=TRUE)), a.EQ(lIp, pbeta(x, a, b, lower.tail=FALSE, log.p=TRUE)), a.EQ( Ip, pbeta(x, a, b, lower.tail=FALSE)) ) ## When 'q' is a bigrational (i.e., class "bigq", package 'gmp'), everything ## is computed *exactly* with bigrational arithmetic: (q4 <- as.bigq(1, 2^(0:4))) pb4 <- pbetaI(q4, 10, 288, lower.tail=FALSE) stopifnot( is.bigq(pb4) ) mpb4 <- as(pb4, "mpfr") mpb4[1:2] getPrec(mpb4) # 128 349 1100 1746 2362 (pb. <- pbeta(asNumeric(q4), 10, 288, lower.tail=FALSE)) stopifnot(mpb4[1] == 0, all.equal(mpb4, pb., tol=4e-15)) qbetaI. <- function(p, shape1, shape2, ncp = 0, lower.tail = TRUE, log.p = FALSE, precBits = NULL, rnd.mode = c("N", "D", "U", "Z", "A"), tolerance = 1e-20, ...) { if(is.na(a <- as.integer(shape1))) stop("a = shape1 is not coercable to finite integer") if(is.na(b <- as.integer(shape2))) stop("b = shape2 is not coercable to finite integer") unirootR(function(q) pbetaI(q, a, b, lower.tail=lower.tail, log.p=log.p, precBits=precBits, rnd.mode=rnd.mode) - p, interval = if(log.p) c(-double.xmax, 0) else 0:1, tol = tolerance, ...) } # end{qbetaI} (p <- 1 - mpfr(1,128)/20) # 'p' must be high precision q95.1.3 <- qbetaI.(p, 1,3, tolerance = 1e-29) # -> ~29 digits accuracy str(q95.1.3) ; roundMpfr(q95.1.3$root, precBits = 29 * log2(10)) ## relative error is really small: (relE <- asNumeric(1 - pbetaI(q95.1.3$root, 1,3) / p)) stopifnot(abs(relE) < 1e-28) }%examples \keyword{arith} \keyword{distribution} Rmpfr/man/formatHex.Rd0000644000175000017500000001634313220705115014474 0ustar nileshnilesh\name{formatHex} \title{Flexibly Format Numbers in Binary, Hex and Decimal Format} \alias{formatHex} \alias{formatBin} \alias{formatDec} %% \alias{formatHexInternal} \alias{print.Ncharacter}% not mentioned \description{ Show numbers in binary, hex and decimal format. The resulting character-like objects can be back-transformed to \code{"mpfr"} numbers via \code{\link{mpfr}()}. } \usage{ formatHex(x, precBits = min(getPrec(x)), style = "+", expAlign = TRUE) formatBin(x, precBits = min(getPrec(x)), scientific = TRUE, left.pad = "_", right.pad = left.pad, style = "+", expAlign = TRUE) %% FIXME: Currently needed mainly because decimal point alignment. %% ----- TODO: Allow formatMpfr(.) to do decimal alignment -- even by default formatDec(x, precBits = min(getPrec(x)), digits = decdigits, nsmall = NULL, scientific = FALSE, style = "+", decimalPointAlign = TRUE, \dots) %% ## not exported: %% formatHexInternal(x, precBits = min(Rmpfr::getPrec(x)), style = "+", expAlign=TRUE) %% formatAlign(x, leftpad=" ", rightpad=leftpad, \dots) %% sprintfMpfr(x, bits, style = "+", expAlign=TRUE) } \arguments{ \item{x}{a \code{numeric} or \code{\link{mpfr}} \R object.} \item{precBits}{integer, the number of bits of precision, typically derived from \code{x}, see \code{\link{getPrec}}. Numeric, i.e., double precision numbers have 53 bits. For more detail, see \code{\link[Rmpfr]{mpfr}}.} \item{style}{a single character, to be used in \code{\link{sprintf}}'s format (\code{fmt}), immediately after the "%". The default always sets a sign in the output, i.e., \code{"+"} or \code{"-"}, where as \code{style = " "} may seem more standard.} \item{expAlign}{\code{\link{logical}} indicating if for scientific (\dQuote{exponential}) representations the exponents should be aligned to the same width, i.e., zero-padded to the same number of digits.} \item{scientific}{\code{\link{logical}} indicating that \code{formatBin} should display the binary representation in scientific notation (\code{mpfr(3, 5)} is displayed as \code{+0b1.1000p+1}). When \code{FALSE}, \code{formatBin} will display the binary representation in regular format shifted to align binary points (\code{mpfr(3, 5)} is displayed \code{+0b11.000}).} \item{\dots}{additional optional arguments. %% \code{formatHexInternal}, \code{formatHex}, \code{formatBin}: \code{precBits} is the only \code{\dots} argument acted on. Other \code{\dots} arguments are ignored. \code{formatDec}: \code{precBits} is acted on. Any argument accepted by \code{\link[base]{format}} (except \code{nsmall}) is acted on. Other \code{\dots} arguments are ignored. } \item{left.pad, right.pad}{characters (one-character strings) that will be used for left- and right-padding of the formatted string when \code{scientific=FALSE}. \emph{Do not change these unless for display-only purpose !!}} \item{nsmall}{only used when \code{scientific} is false, then passed to \code{\link{format}()}. If \code{NULL}, the default is computed from the range of the non-zero values of \code{x}.} \item{digits}{integer; the number of decimal digits displayed is the larger of this argument and the internally generated value that is a function of \code{precBits}. This is related to but different than \code{digits} in \code{\link{format}}.} \item{decimalPointAlign}{logical indicating if padding should be used to ensure that the resulting strings align on the decimal point (\code{"."}).} } \details{ For the hexadecimal representation, when the precision is not larger than double precision, \code{\link[base]{sprintf}()} is used directly, otherwise \code{\link{formatMpfr}()} is used and post processed. For the binary representation, the hexadecimal value is calculated and then edited by substitution of the binary representation of the hex characters coded in the \code{HextoBin} vector. For binary with \code{scientific=FALSE}, the result of the \code{scientific=TRUE} version is edited to align binary points. For the decimal representation, the hexadecimal value is calculated with the specified precision and then sent to the \code{format} function for \code{scientific=FALSE} or to the sprintf function for \code{scientific=TRUE}. } \value{ a character vector (or matrix) like \code{x}, say \code{r}, containing the formatted represention of \code{x}, with a \code{\link{class}} (unless \code{left.pad} or \code{right.pad} were not \code{"_"}). In that case, \code{formatHex()} and \code{formatBin()} return class \code{"Ncharacter"}; for that, \code{\link{mpfr}(.)} has a method and will basically return \code{x}, i.e., work as \emph{inverse} function. Since \pkg{Rmpfr} version \command{0.6-2}, the S3 class \code{"Ncharacter"} extends \code{"character"}. (\code{class(.)} is now of length two and \code{class(.)[2]} is \code{"character"}.). There are simple \code{[} and \code{\link{print}} methods; modifying or setting \code{dim} works as well. } \references{ R FAQ 7.31: Why doesn't R think these numbers are equal? \code{system.file("../../doc/FAQ")} } \author{Richard M. Heiberger \email{rmh@temple.edu}, with minor tweaking by Martin M.} \seealso{ \code{\link[Rmpfr]{mpfr}}, \code{\link[base]{sprintf}} } \examples{ FourBits <- mpfr(matrix(0:31, 8, 4, dimnames = list(0:7, c(0,8,16,24))), precBits=4) ## 4 significant bits FourBits formatHex(FourBits) formatBin(FourBits, style = " ") formatBin(FourBits, scientific=FALSE) formatDec(FourBits) ## as "Ncharacter" 'inherits from' "character", this now works too : data.frame(Dec = c( formatDec(FourBits) ), formatHex(FourBits), Bin = formatBin(FourBits, style = " ")) FBB <- formatBin(FourBits) ; clB <- class(FBB) (nFBB <- mpfr(FBB)) stopifnot(class(FBB)[1] == "Ncharacter", all.equal(nFBB, FourBits, tol=0)) FBH <- formatHex(FourBits) ; clH <- class(FBH) (nFBH <- mpfr(FBH)) stopifnot(class(FBH)[1] == "Ncharacter", all.equal(nFBH, FourBits, tol=0)) ## Compare the different "formattings" (details will change, i.e. improve!)%% FIXME M <- mpfr(c(-Inf, -1.25, 1/(-Inf), NA, 0, .5, 1:2, Inf), 3) data.frame(fH = formatHex(M), f16 = format(M, base=16), fB = formatBin(M), f2 = format(M, base= 2), fD = formatDec(M), f10 = format(M), # base = 10 is default fSci= format(M, scientific=TRUE), fFix= format(M, scientific=FALSE)) ## Other methods ("[", t()) also work : stopifnot(dim(F1 <- FBB[, 1, drop=FALSE]) == c(8,1), identical(class( F1), clB), dim(t(F1)) == c(1,8), identical(class(t(F1)),clB), is.null(dim(F.2 <- FBB[,2])), identical(class( F.2), clB), dim(F22 <- FBH[1:2, 3:4]) == c(2,2), identical(class(F22), clH), identical(class(FBH[2,3]), clH), is.null(dim(FBH[2,3])), identical(FBH[2,3:4], F22[2,]), identical(FBH[2,3], unname(FBH[,3][2])), TRUE) TenFrac <- matrix((1:10)/10, dimnames=list(1:10, expression(1/x))) TenFrac9 <- mpfr(TenFrac, precBits=9) ## 9 significant bits TenFrac9 formatHex(TenFrac9) formatBin(TenFrac9) formatBin(TenFrac9, scientific=FALSE) formatDec(TenFrac9) formatDec(TenFrac9, precBits=10) } \keyword{ arith } Rmpfr/man/distr-etc.Rd0000644000175000017500000000637414107223103014435 0ustar nileshnilesh\name{mpfr-distr-etc} \title{Distribution Functions etc (MPFR)} \alias{pnorm} \alias{dnorm} \alias{dbinom} \alias{dnbinom} \alias{dgamma} \alias{dpois} \alias{dt} \alias{mpfr-distr}% <- alternative for \link \usage{% >>>> ../R/special-fun.R <<<< dpois (x, lambda, log = FALSE, useLog = ) dbinom (x, size, prob, log = FALSE, useLog = ) dnbinom(x, size, prob, mu, log = FALSE, useLog = any(x > 1e6)) dnorm (x, mean = 0, sd = 1, log = FALSE) dgamma(x, shape, rate = 1, scale = 1/rate, log = FALSE) dt (x, df, ncp, log = FALSE) pnorm(q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE) } \description{ For some \R standard (probability) density, distribution or quantile functions, we provide MPFR versions. } \details{ \code{pnorm()} is based on \code{\link{erf}()} and \code{erfc()} which have direct MPFR counter parts and are both reparametrizations of \code{pnorm}, \code{erf(x) = 2*pnorm(sqrt(2)*x)} and \code{erfc(x) = 2* pnorm(sqrt(2)*x, lower=FALSE)}. } \note{E.g., for \code{pnorm(*, log.p = TRUE)} to be useful, i.e., not to underflow or overflow, you may want to extend the exponential range of MPFR numbers, using \code{\link{.mpfr_erange_set}()}, see the examples. } \arguments{ \item{x,q, lambda, size,prob, mu, mean,sd, shape,rate,scale, df,ncp}{% \code{\link{numeric}} or \code{\linkS4class{mpfr}} vectors. % for the function call. All of these are \dQuote{recycled} to the length of the longest one. For their meaning/definition, see the corresponding standard R (\pkg{stats} package) function.} \item{log, log.p, lower.tail}{logical, see \code{\link[stats:Normal]{pnorm}}, \code{\link[stats:Poisson]{dpois}}, etc.} \item{useLog}{\code{\link{logical}} with default depending on \code{x} etc, indicating if log-scale computation should be used even when \code{log = FALSE}, for performance or against overflow / underflow.} } \value{ A vector of the same length as the longest of \code{x,q, ...}, of class \code{\linkS4class{mpfr}} with the high accuracy results of the corresponding standard \R function. } \seealso{\code{\link[stats:Normal]{pnorm}}, \code{\link[stats]{dt}}, \code{\link[stats]{dbinom}}, \code{\link[stats]{dnbinom}}, \code{\link[stats]{dgamma}}, \code{\link[stats]{dpois}} in standard package \pkg{stats}. \code{\link{pbetaI}(x, a,b)} is a \code{\link{mpfr}} version of \code{\link{pbeta}} only for \emph{integer} \code{a} and \code{b}. } \examples{ x <- 1400+ 0:10 print(dpois(x, 1000), digits =18) ## standard R's double precision dpois(mpfr(x, 120), 1000)## more accuracy for the same dpois(0:5, mpfr(10000, 80)) ## very small exponents (underflowing in dbl.prec.) print(dbinom(0:8, 8, pr = 4 / 5), digits=18) dbinom(0:8, 8, pr = 4/mpfr(5, 99)) -> dB; dB print(dnorm( -5:5), digits=18) dnorm(mpfr(-5:5, prec=99)) ## For pnorm() in the extreme tails, need an exponent range ## larger than the (MPFR and Rmpfr) default: (old_eranges <- .mpfr_erange()) # typically -/+ 2^30 .mpfr_erange_set(value = (1-2^-52)*.mpfr_erange(c("min.emin","max.emax"))) tens <- mpfr(10^(4:7), 128) pnorm(tens, lower.tail=FALSE, log.p=TRUE) # "works" ## reset to previous .mpfr_erange_set( , old_eranges) pnorm(tens, lower.tail=FALSE, log.p=TRUE) # all but first underflow to -Inf } \keyword{distribution} Rmpfr/man/optimizeR.Rd0000644000175000017500000001337613752457464014551 0ustar nileshnilesh\name{optimizeR} \alias{optimizeR} \title{High Precision One-Dimensional Optimization} %% Compare with ~/R/D/r-devel/R/src/library/stats/man/optimize.Rd \description{ \code{optimizeR} searches the interval from \code{lower} to \code{upper} for a minimum % TODO ? or maximum of the function \code{f} with respect to its first argument. } \usage{ optimizeR(f, lower, upper, ..., tol = 1e-20, method = c("Brent", "GoldenRatio"), maximum = FALSE, precFactor = 2.0, precBits = -log2(tol) * precFactor, maxiter = 1000, trace = FALSE) } \arguments{ \item{f}{the function to be optimized. \code{f(x)} must work \dQuote{in \pkg{Rmpfr} arithmetic} for \code{optimizer()} to make sense. The function is either minimized or maximized over its first argument depending on the value of \code{maximum}.} \item{\dots}{additional named or unnamed arguments to be passed to \code{f}.} \item{lower}{the lower end point of the interval to be searched.} \item{upper}{the upper end point of the interval to be searched.} \item{tol}{the desired accuracy, typically higher than double precision, i.e., \code{tol < 2e-16}.} \item{method}{\code{\link{character}} string specifying the optimization method.}% \item{maximum}{logical indicating if \eqn{f()} should be maximized or minimized (the default).} \item{precFactor}{only for default \code{precBits} construction: a factor to multiply with the number of bits directly needed for \code{tol}.} \item{precBits}{number of bits to be used for \code{\link[Rmpfr]{mpfr}} numbers used internally.} \item{maxiter}{maximal number of iterations to be used.} \item{trace}{integer or logical indicating if and how iterations should be monitored; if an integer \eqn{k}, print every \eqn{k}-th iteration.} } \details{ \describe{ \item{\code{"Brent"}:}{Brent(1973)'s simple and robust algorithm is a hybrid, using a combination of the golden ratio and local quadratic (\dQuote{parabolic}) interpolation. This is the same algorithm as standard \R's \code{\link{optimize}()}, adapted to high precision numbers. In smooth cases, the convergence is considerably faster than the golden section or Fibonacci ratio algorithms. } \item{\code{"GoldenRatio"}:}{The golden ratio method, aka \sQuote{golden-section search} works as follows: from a given interval containing the solution, it constructs the next point in the golden ratio between the interval boundaries. } }% end{describe} } \value{ A \code{\link{list}} with components \code{minimum} (or \code{maximum}) and \code{objective} which give the location of the minimum (or maximum) and the value of the function at that point; \code{iter} specifiying the number of iterations, the logical \code{convergence} indicating if the iterations converged and \code{estim.prec} which is an estimate or an upper bound of the final precision (in \eqn{x}). \code{method} the string of the method used. } % \references{ % } \author{ \code{"GoldenRatio"} is based on Hans Werner Borchers' \code{\link[pracma]{golden_ratio}} (package \CRANpkg{pracma}); modifications and \code{"Brent"} by Martin Maechler. } % \note{ % } \seealso{ \R's standard \code{\link{optimize}}; for multivariate optimization, \pkg{Rmpfr}'s \code{\link{hjkMpfr}()}; for root finding, \pkg{Rmpfr}'s \code{\link{unirootR}}. } \examples{ ## The minimum of the Gamma (and lgamma) function (for x > 0): Gmin <- optimizeR(gamma, .1, 3, tol = 1e-50) str(Gmin, digits = 8) ## high precision chosen for "objective"; minimum has "estim.prec" = 1.79e-50 Gmin[c("minimum","objective")] ## it is however more accurate to 59 digits: asNumeric(optimizeR(gamma, 1, 2, tol = 1e-100)$minimum - Gmin$minimum) iG5 <- function(x) -exp(-(x-5)^2/2) curve(iG5, 0, 10, 200) o.dp <- optimize (iG5, c(0, 10)) #-> 5 of course oM.gs <- optimizeR(iG5, 0, 10, method="Golden") oM.Br <- optimizeR(iG5, 0, 10, method="Brent", trace=TRUE) oM.gs$min ; oM.gs$iter oM.Br$min ; oM.Br$iter (doExtras <- Rmpfr:::doExtras()) if(doExtras) {## more accuracy {takes a few seconds} oM.gs <- optimizeR(iG5, 0, 10, method="Golden", tol = 1e-70) oM.Br <- optimizeR(iG5, 0, 10, tol = 1e-70) } rbind(Golden = c(err = as.numeric(oM.gs$min -5), iter = oM.gs$iter), Brent = c(err = as.numeric(oM.Br$min -5), iter = oM.Br$iter)) ## ==> Brent is orders of magnitude more efficient ! ## Testing on the sine curve with 40 correct digits: sol <- optimizeR(sin, 2, 6, tol = 1e-40) str(sol) sol <- optimizeR(sin, 2, 6, tol = 1e-50, precFactor = 3.0, trace = TRUE) pi.. <- 2*sol$min/3 print(pi.., digits=51) stopifnot(all.equal(pi.., Const("pi", 256), tolerance = 10*1e-50)) if(doExtras) { # considerably more expensive ## a harder one: f.sq <- function(x) sin(x-2)^4 + sqrt(pmax(0,(x-1)*(x-4)))*(x-2)^2 curve(f.sq, 0, 4.5, n=1000) msq <- optimizeR(f.sq, 0, 5, tol = 1e-50, trace=5) str(msq) # ok stopifnot(abs(msq$minimum - 2) < 1e-49) ## find the other local minimum: -- non-smooth ==> Golden ratio -section is used msq2 <- optimizeR(f.sq, 3.5, 5, tol = 1e-50, trace=10) stopifnot(abs(msq2$minimum - 4) < 1e-49) ## and a local maximum: msq3 <- optimizeR(f.sq, 3, 4, maximum=TRUE, trace=2) stopifnot(abs(msq3$maximum - 3.57) < 1e-2) }#end {doExtras} ##----- "impossible" one to get precisely ------------------------ ff <- function(x) exp(-1/(x-8)^2) curve(exp(-1/(x-8)^2), -3, 13, n=1001) (opt. <- optimizeR(function(x) exp(-1/(x-8)^2), -3, 13, trace = 5)) ## -> close to 8 {but not very close!} ff(opt.$minimum) # gives 0 if(doExtras) { ## try harder ... in vain .. str(opt1 <- optimizeR(ff, -3,13, tol = 1e-60, precFactor = 4)) print(opt1$minimum, digits=20) ## still just 7.99998038 or 8.000036655 {depending on method} } } \keyword{optimize} Rmpfr/man/mpfr-utils.Rd0000644000175000017500000002715414107223103014640 0ustar nileshnilesh\name{mpfr-utils} \title{Rmpfr -- Utilities for Precision Setting, Printing, etc} \alias{getPrec} \alias{.getPrec} \alias{getD} \alias{mpfr_default_prec} \alias{mpfr2array} \alias{mpfrImport} \alias{mpfrXport} %\alias{.mpfr1tolist}% not exported \alias{print.mpfr} \alias{print.mpfrArray} \alias{toNum} \alias{.mpfr2list} %- \alias{.mpfr_formatinfo} \alias{.mpfr2exp} %- \alias{.mpfr_erange} \alias{.mpfr_erange_set} \alias{.mpfr_erange_kinds} \alias{.mpfr_erange_is_int} \alias{.mpfr_maxPrec} \alias{.mpfr_minPrec} \description{ This page documents utilities from package \pkg{Rmpfr} which are typically not called by the user, but may come handy in some situations. Notably, the (base-2) maximal (and minimal) precision and the \dQuote{erange}, the range of possible (base-2) exponents of \code{\link{mpfr}}-numbers can be queried and partly extended. } \usage{ getPrec(x, base = 10, doNumeric = TRUE, is.mpfr = NA, bigq. = 128L) .getPrec(x) getD(x) mpfr_default_prec(prec) \S3method{print}{mpfrArray}(x, digits = NULL, drop0trailing = FALSE, right = TRUE, max.digits = getOption("Rmpfr.print.max.digits", 999L), exponent.plus = getOption("Rmpfr.print.exponent.plus", TRUE), \dots) \S3method{print}{mpfr}(x, digits = NULL, drop0trailing = TRUE, right = TRUE, max.digits = getOption("Rmpfr.print.max.digits", 999L), exponent.plus = getOption("Rmpfr.print.exponent.plus", TRUE), \dots) toNum(from, rnd.mode = c('N','D','U','Z','A')) mpfr2array(x, dim, dimnames = NULL, check = FALSE) .mpfr2list(x, names = FALSE) mpfrXport(x, names = FALSE) mpfrImport(mxp) .mpfr_formatinfo(x) .mpfr2exp(x) .mpfr_erange(kind = c("Emin", "Emax"), names = TRUE) .mpfr_erange_set(kind = c("Emin", "Emax"), value) .mpfr_erange_kinds .mpfr_erange_is_int() .mpfr_maxPrec() .mpfr_minPrec() } \arguments{ \item{x, from}{typically, an \R object of class \code{"\linkS4class{mpfr}"}, or \code{"\linkS4class{mpfrArray}"}, respectively. For \code{getPrec()}, any number-like \R object, or \code{\link{NULL}}.} \item{base}{(only when \code{x} is \code{\link{character}}) the base with respect to which \code{x[i]} represent numbers; \code{base} \eqn{b} must fulfill \eqn{2 \le b \le 62}{2 <= b <= 62}.} \item{doNumeric}{logical indicating \code{\link{integer}} or \code{\link{double}} typed \code{x} should be accepted and a default precision be returned. Should typically be kept at default \code{TRUE}.} \item{is.mpfr}{logical indicating if \code{\link{class}(x)} is already known to be \code{"mpfr"}; typically should be kept at default, \code{NA}.} \item{bigq.}{for \code{getPrec()}, the precision to use for a big rational (class \code{"bigq"}); if not specified gives warning when used.} \item{prec}{a positive integer, or missing.} \item{drop0trailing}{logical indicating if trailing \code{"0"}s should be omitted.} \item{right}{logical indicating \code{print()}ing should right justify the strings; see \code{\link{print.default}()} to which it is passed.} \item{digits, \dots}{further arguments to print methods.} \item{max.digits}{a number (possibly \code{Inf}) to limit the number of (mantissa) digits to be printed, simply passed to \code{\link{formatMpfr}()}. The default is finite to protect from printing very long strings which is often undesirable, notably in \code{\link{interactive}} use.} \item{exponent.plus}{logical, simply passed to \code{\link{formatMpfr}()}. Was \code{FALSE} hardwired in Rmpfr versions before 0.8-0, and hence is allowed to be tweaked by an \code{\link{options}()} setting.} \item{rnd.mode}{a 1-letter string specifying how \emph{rounding} should happen at C-level conversion to MPFR, see details of \code{\link{mpfr}}.} \item{dim, dimnames}{for \code{"\linkS4class{mpfrArray}"} construction.} \item{check}{logical indicating if the mpfrArray construction should happen with internal safety check. Previously, the implicit default used to be true.} \item{names}{(for \code{.mpfr2list()}) \code{\link{logical}} or \code{\link{character}} vector, indicating if the list returned should have \code{\link{names}}. If character, it specifies the names; if true, the names are set to \code{format(x)}.} \item{mxp}{an \code{"mpfrXport"} object, as resulting from \code{mpfrXport()}.} \item{kind}{a \code{\link{character}} string or vector, specifying the kind of \dQuote{erange} value; must be an element of \code{.mpfr_erange_kinds}, i.e., one of \code{"Emin"}, \code{"Emax"}, \code{"min.emin"}, \code{"max.emin"}, \code{"min.emax"}, \code{"max.emax"}.} \item{value}{\code{\link{numeric}}, for \code{.mpfr_erange_set()} one number per \code{kind}. Must be in range specified by the \code{*."emin"} and \code{*."emax"} erange values.} } \details{ The \code{print} method is currently built on the \code{\link{format}} method for class \code{\linkS4class{mpfr}}. This, currently does \emph{not} format columns jointly which leads to suboptimally looking output. There are plans to change this. Note that \code{\link{formatMpfr}()} which is called by \code{print()} (or \code{show()} or \R's implicit printing) uses \code{max.digits = Inf}, differing from our \code{print()}'s default on purpose. If you do want to see the full accuracy even in cases it is large, use \code{\link{options}(Rmpfr.print.max.digits = Inf)} or \code{(.. = 1e7)}, say. The \code{.mpfr_erange*} functions (and variable) allow to query and set the allowed range of values for the base-2 \emph{exponents} of \code{"mpfr"} numbers. See the examples below and GNU MPFR library documentation on the C functions \code{mpfr_get_emin()}, \code{mpfr_set_emin(.)}, \code{mpfr_get_emin_min()}, and \code{mpfr_get_emin_max()}, (and those four with \sQuote{_emin} replaced by \sQuote{_emax} above). } \value{ \code{getPrec(x)} returns a \code{\link{integer}} vector of length one or the same length as \code{x} when that is positive, whereas \code{getPrec(NULL)} returns \code{mpfr_default_prec()}, see below. % the current MPFR default precision, see \code{mpfr_default_prec()} If you need to \emph{change} the precision of \code{x}, i.e., need something like \dQuote{setPrec}, use \code{\link{roundMpfr}()}. \code{.getPrec(x)} is a simplified version of \code{getPrec()} which only works for \code{"mpfr"} objects \code{x}. \code{getD(x)} is intended to be a fast version of \code{x@.Data}, and should not be used outside of lower level functions. \code{mpfr_default_prec()} returns the current MPFR default precision, an \code{\link{integer}}. This is currently % ?? not made use of much in package \pkg{Rmpfr}, where functions have their own default precision where needed, and otherwise we'd rather not be dependent of such a \emph{global} setting. \cr \code{mpfr_default_prec(prec)} \emph{sets} the current MPFR default precision and returns the previous one; see above. \code{.mpfr_maxPrec()} and (less interestingly) \code{.mpfr_minPrec()} give the maximal and minimal base-2 precision allowed in the current version of the MPFR library linked to by \R package \pkg{Rmpfr}. The maximal precision is typically \eqn{2^{63}}, i.e., \preformatted{ all.equal(.mpfr_maxPrec(), 2^63) } is typically true. \code{toNum(m)} returns a numeric \code{\link{array}} or \code{\link{matrix}}, when \code{m} is of class \code{"\linkS4class{mpfrArray}"} or \code{"\linkS4class{mpfrMatrix}"}, respectively. It should be equivalent to \code{as(m, "array")} or \code{... "matrix"}. Note that the slightly more general \code{\link{asNumeric}()} is preferred now. \code{mpfr2array()} a slightly more flexible alternative to \code{dim(.) <- dd}. \code{.mpfr2exp(x)} returns the base-2 (integer valued) exponents of \code{x}, i.e., it is the \R interface to MPFR C's \code{mpfr_get_exp()}. The result is \code{\link{integer}} iff \code{.mpfr_erange_is_int()} is true, otherwise \code{\link{double}}. Note that the MPFR (4.0.1) manual says about \code{mpfr_get_exp()}: \emph{The behavior for NaN, infinity or zero is undefined}. \code{.mpfr_erange_is_int()} returns \code{TRUE} iff the \code{.mpfr_erange(c("Emin","Emax"))} range lies inside the range of \R's \code{\link{integer}} limits, i.e., has absolute values not larger than \code{\link{.Machine}$integer.max} (\eqn{ = 2^{31} - 1}). \code{.mpfr_erange_set()} \emph{invisibly} (see \code{\link{invisible}()}) returns \code{TRUE} iff the change was successful. \code{.mpfr_formatinfo(x)} returns conceptually a subset of \code{\link{.mpfr2str}()}'s result, a list with three components \item{exp}{the base-2 exponents of \code{x}, identical to \code{.mpfr2exp(x)}.} \item{finite}{\code{\link{logical}} identical to \code{\link{is.finite}(x)}.} \item{is.0}{\code{\link{logical}} indicating if the corresponding \code{x[i]} is zero; identical to \code{\link{mpfrIs0}(x)}.} (Note that \code{\link{.mpfr2str}(x, .., base)$exp} is wrt \code{base} \emph{and} is not undefined but } \note{ \code{mpfrXport()} and \code{mpfrImport()} are \bold{experimental} and used to explore reported platform incompatibilities of \code{\link{save}()}d and \code{\link{load}()}ed \code{"mpfr"} objects between Windows and non-Windows platforms. In other words, the format of the result of \code{mpfrXport()} and hence the \code{mxp} argument to \code{mpfrImport()} are considered internal, not part of the API and subject to change. } \seealso{ Start using \code{\link{mpfr}(..)}, and compute with these numbers. \code{\link{mpfrArray}(x)} is for numeric (\dQuote{non-mpfr}) \code{x}, whereas \code{mpfr2array(x)} is for \code{"mpfr"} classed \code{x}, only. } \examples{ getPrec(as(c(1,pi), "mpfr")) # 128 for both (opr <- mpfr_default_prec()) ## typically 53, the MPFR system default stopifnot(opr == (oprec <- mpfr_default_prec(70)), 70 == mpfr_default_prec()) ## and reset it: mpfr_default_prec(opr) ## Explore behavior of rounding modes 'rnd.mode': x <- mpfr(10,99)^512 # too large for regular (double prec. / numeric): sapply(c("N", "D", "U", "Z", "A"), function(RM) sapply(list(-x,x), function(.) toNum(., RM))) ## N D U Z A ## -Inf -Inf -1.797693e+308 -1.797693e+308 -Inf ## Inf 1.797693e+308 Inf 1.797693e+308 Inf ## Printing of "MPFR" matrices is less nice than R's usual matrix printing: m <- outer(c(1, 3.14, -1024.5678), c(1, 1e-3, 10,100)) m[3,3] <- round(m[3,3]) m mpfr(m, 50) B6 <- mpfr2array(Bernoulli(1:6, 60), c(2,3), dimnames = list(LETTERS[1:2], letters[1:3])) B6 ## Ranges of (base 2) exponents of MPFR numbers: .mpfr_erange() # the currently active range of possible base 2 exponents: ## A factory fresh setting fulfills .mpfr_erange(c("Emin","Emax")) == c(-1,1) * (2^30 - 1) ## There are more 'kind's, the latter 4 showing how you could change the first two : .mpfr_erange_kinds .mpfr_erange(.mpfr_erange_kinds) eLimits <- .mpfr_erange(c("min.emin", "max.emin", "min.emax", "max.emax")) ## Typically true in "current" MPFR versions: eLimits == c(-1,1, -1,1) * (2^62 - 1) ## Looking at internal representation [for power users only!]: i8 <- mpfr(-2:5, 32) x4 <- mpfr(c(NA, NaN, -Inf, Inf), 32) ## The output of the following depends on the GMP "numb" size ## (32 bit vs. 64 bit), and may be even more platform specific: str( .mpfr2list(i8) ) str( .mpfr2list(x4, names = TRUE) ) str(xp4 <- mpfrXport(x4, names = TRUE)) stopifnot(identical(x4, mpfrImport(mpfrXport(x4))), identical(i8, mpfrImport(mpfrXport(i8)))) ## FIXME, need c(.), as dim(.) "get lost": stopifnot(identical(c(B6), mpfrImport(mpfrXport(B6)))) } \keyword{utilities} Rmpfr/man/atomicVector-class.Rd0000644000175000017500000000241511247771434016312 0ustar nileshnilesh%% almost straight copy of ../../Matrix/man/atomicVector-class.Rd \name{atomicVector-class} \docType{class} \alias{atomicVector-class} \title{Virtual Class "atomicVector" of Atomic Vectors} \description{ The \code{\link{class}} \code{"atomicVector"} is a \emph{virtual} class containing all atomic vector classes of base \R, as also implicitly defined via \code{\link{is.atomic}}. } \section{Objects from the Class}{A virtual Class: No objects may be created from it.} \section{Methods}{ In the \pkg{Matrix} package, the "atomicVector" is used in signatures where typically \dQuote{old-style} "matrix" objects can be used and can be substituted by simple vectors. } \section{Extends}{%% FIXME: promptClass() should show the direct subclasses ! The atomic classes \code{"logical"}, \code{"integer"}, \code{"double"}, \code{"numeric"}, \code{"complex"}, \code{"raw"} and \code{"character"} are extended directly. Note that \code{"numeric"} already contains \code{"integer"} and \code{"double"}, but we want all of them to be direct subclasses of \code{"atomicVector"}. } \author{Martin Maechler} \seealso{ \code{\link{is.atomic}}, \code{\link{integer}}, \code{\link{numeric}}, \code{\link{complex}}, etc. } \examples{ showClass("atomicVector") } \keyword{classes} Rmpfr/man/fr_ld_expMpfr.Rd0000644000175000017500000000506314127021566015333 0ustar nileshnilesh\name{frexpMpfr} \alias{frexpMpfr} \alias{ldexpMpfr} \title{Base-2 Representation and Multiplication of Mpfr Numbers}% ../DPQ/man/fr_ld_exp.Rd \description{ MPFR - versions of the C99 (and POSIX) standard C (and C++) mathlib functions \code{frexp()} and \code{ldexp()}. \code{frexpMpfr(x)} computes base-2 exponent \code{e} and \dQuote{mantissa}, or \emph{fraction} \code{r}, such that \eqn{x = r * 2^e}, where \eqn{r \in [0.5, 1)} (unless when \code{x} is in \code{c(0, -Inf, Inf, NaN)} where \code{r == x} and \code{e} is 0), and \eqn{e} is integer valued. \code{ldexpMpfr(f, E)} is the \emph{inverse} of \code{frexpMpfr()}: Given fraction or mantissa \code{f} and integer exponent \code{E}, it returns \eqn{x = f * 2^E}. Viewed differently, it's the fastest way to multiply or divide MPFR numbers with \eqn{2^E}. } \usage{ frexpMpfr(x, rnd.mode = c("N", "D", "U", "Z", "A")) ldexpMpfr(f, E, rnd.mode = c("N", "D", "U", "Z", "A")) } \arguments{ \item{x}{numeric (coerced to \code{double}) vector.} \item{f}{numeric fraction (vector), in \eqn{[0.5, 1)}.} \item{E}{integer valued, exponent of \code{2}, i.e., typically in \code{(-1024-50):1024}, otherwise the result will underflow to 0 or overflow to \code{+/- Inf}.} \item{rnd.mode}{a 1-letter string specifying how \emph{rounding} should happen at C-level conversion to MPFR, see \code{\link{mpfr}}.} } %% \details{ %% } \value{ \code{frexpMpfr} returns a \code{\link{list}} with named components \code{r} (of class \code{mpfr}) and \code{e} (integer valued, of type \code{integer} is small enough, \code{"double"} otherwise). } \references{ On unix-alikes, typically \command{man frexp} and \command{man ldexp} } \author{Martin Maechler} %% \note{ %% } \seealso{ Somewhat related, \code{\link{.mpfr2exp}()}. %_TODO_: that DPQ version is not yet on CRAN: %\code{\link[DPQ]{frexp}()} and \code{ldexp()} in package \CRANpkg{DPQ}. } \examples{ set.seed(47) x <- c(0, 2^(-3:3), (-1:1)/0, sort(rlnorm(2^12, 10, 20) * sample(c(-1,1), 512, replace=TRUE))) head(xM <- mpfr(x, 128), 11) str(rFM <- frexpMpfr(xM)) d.fr <- with(rFM, data.frame(x=x, r=asNumeric(r), e=e)) head(d.fr , 16) tail(d.fr) ar <- abs(rFM$r) stopifnot(0.5 <= ar[is.finite(x) & x != 0], ar[is.finite(x)] < 1, is.integer(rFM$e)) ldx <- mpfr(with(rFM, ldexpMpfr(r, e))) (iN <- which(is.na(x))) # 10 stopifnot(exprs = { all.equal(xM, ldx, tol = 2^-124) # allow 4 bits loss, but apart from the NA, even: identical(xM[-iN], ldx[-iN]) is.na(xM [iN]) is.na(ldx[iN]) }) } \keyword{arithmetic} \keyword{utilities} Rmpfr/man/log1mexp.Rd0000644000175000017500000001025113751607232014275 0ustar nileshnilesh\name{log1mexp}% originally ~/R/Pkgs/copula/man/log1mexp.Rd __keep in sync !!__ \alias{log1pexp} \alias{log1mexp} \title{Compute f(a) = \eqn{\mathrm{log}}{log}(1 +/- \eqn{\mathrm{exp}}{exp}(-a)) Numerically Optimally} \description{ Compute f(a) = log(1 - exp(-a)), respectively g(x) = log(1 + exp(x)) quickly numerically accurately. } \usage{ log1mexp(a, cutoff = log(2)) log1pexp(x, c0 = -37, c1 = 18, c2 = 33.3) } \arguments{ \item{a}{numeric (or \code{\link{mpfr}}) vector of positive values.} \item{x}{numeric vector, may also be an \code{"\link{mpfr}"} object.} \item{cutoff}{positive number; \code{log(2)} is \dQuote{optimal}, %% see below, TODO but the exact value is unimportant, and anything in \eqn{[0.5, 1]} is fine.} \item{c0, c1, c2}{cutoffs for \code{log1pexp}; see below.} } \value{ \deqn{log1mexp(a) := f(a) = \log(1 - \exp(-a)) = \mathrm{log1p}(-\exp(-a)) = \log(-\mathrm{expm1}(-a))}{% log1mexp(a) := f(a) = log(1 - exp(-a)) = log1p(- exp(-a)) = log(- expm1(-a))} or, respectively, \deqn{log1pexp(x) := g(x) = \log(1 + \exp(x)) = \mathrm{log1p}(\exp(x))}{% log1pexp(x) := g(x) = log(1 + exp(x)) = log1p(exp(x))} computed accurately and quickly. } \author{Martin Maechler, May 2002; \code{log1pexp()} in 2012} \references{% ~/R/Pkgs/Rmpfr/vignettes/log1mexp-note.Rnw Martin \enc{Mächler}{Maechler} (2012). Accurately Computing \eqn{\log(1-\exp(-|a|))}; \url{https://CRAN.R-project.org/package=Rmpfr/vignettes/log1mexp-note.pdf}. % see also <> in ~/R/Pkgs/copula/inst/doc/Frank-Rmpfr.Rnw } \examples{ fExpr <- expression( DEF = log(1 - exp(-a)), expm1 = log(-expm1(-a)), log1p = log1p(-exp(-a)), F = log1mexp(a)) a. <- 2^seq(-58, 10, length = 256) a <- a. ; str(fa <- do.call(cbind, as.list(fExpr))) head(fa)# expm1() works here tail(fa)# log1p() works here ## graphically: lwd <- 1.5*(5:2); col <- adjustcolor(1:4, 0.4) op <- par(mfcol=c(1,2), mgp = c(1.25, .6, 0), mar = .1+c(3,2,1,1)) matplot(a, fa, type = "l", log = "x", col=col, lwd=lwd) legend("topleft", fExpr, col=col, lwd=lwd, lty=1:4, bty="n") # expm1() & log1mexp() work here matplot(a, -fa, type = "l", log = "xy", col=col, lwd=lwd) legend("left", paste("-",fExpr), col=col, lwd=lwd, lty=1:4, bty="n") # log1p() & log1mexp() work here par(op) aM <- 2^seqMpfr(-58, 10, length=length(a.)) # => default prec = 128 a <- aM; dim(faM <- do.call(cbind, as.list(fExpr))) # 256 x 4, "same" as 'fa' ## Here, for small 'a' log1p() and even 'DEF' is still good enough l_f <- asNumeric(log(-faM)) all.equal(l_f[,"F"], l_f[,"log1p"], tol=0) # see TRUE (Lnx 64-bit) io <- a. < 80 # for these, the differences are small all.equal(l_f[io,"F"], l_f[io,"expm1"], tol=0) # see 6.662e-9 all.equal(l_f[io,"F"], l_f[io, "DEF" ], tol=0) stopifnot(exprs = { all.equal(l_f[,"F"], l_f[,"log1p"], tol= 1e-15) all.equal(l_f[io,"F"], l_f[io,"expm1"], tol= 1e-7) all.equal(l_f[io,"F"], l_f[io, "DEF" ], tol= 1e-7) }) ## For 128-bit prec, if we go down to 2^-130, "log1p" is no longer ok: aM2 <- 2^seqMpfr(-130, 10, by = 1/2) a <- aM2; fa2 <- do.call(cbind, as.list(fExpr)) head(asNumeric(fa2), 12) tail(asNumeric(fa2), 12) matplot(a, log(-fa2[,1:3]) -log(-fa2[,"F"]), type="l", log="x", lty=1:3, lwd=2*(3:1)-1, col=adjustcolor(2:4, 1/3)) legend("top", colnames(fa2)[1:3], lty=1:3, lwd=2*(3:1)-1, col=adjustcolor(2:4, 1/3)) cols <- adjustcolor(2:4, 1/3); lwd <- 2*(3:1)-1 matplot(a, 1e-40+abs(log(-fa2[,1:3]) -log(-fa2[,"F"])), type="o", log="xy", main = "log1mexp(a) -- approximation rel.errors, mpfr(*, prec=128)", pch=21:23, cex=.6, bg=5:7, lty=1:2, lwd=lwd, col=cols) legend("top", colnames(fa2)[1:3], bty="n", lty=1:2, lwd=lwd, col=cols, pch=21:23, pt.cex=.6, pt.bg=5:7) ## -------------------------- log1pexp() [simpler] -------------------- curve(log1pexp, -10, 10, asp=1) abline(0,1, h=0,v=0, lty=3, col="gray") ## Cutoff c1 for log1pexp() -- not often "needed": curve(log1p(exp(x)) - log1pexp(x), 16, 20, n=2049) ## need for *some* cutoff: x <- seq(700, 720, by=2) cbind(x, log1p(exp(x)), log1pexp(x)) ## Cutoff c2 for log1pexp(): curve((x+exp(-x)) - x, 20, 40, n=1025) curve((x+exp(-x)) - x, 33.1, 33.5, n=1025) } \keyword{math} Rmpfr/man/sumBinomMpfr.Rd0000644000175000017500000001032413546047111015154 0ustar nileshnilesh\name{sumBinomMpfr} \alias{sumBinomMpfr} \title{(Alternating) Binomial Sums via Rmpfr} \concept{Rice integral} \concept{Forward Difference} \description{ Compute (alternating) binomial sums via high-precision arithmetic. If \eqn{sBn(f, n) :=}\code{sumBinomMpfr(n, f)}, (default \code{alternating} is true, and \code{n0 = 0}), \deqn{sBn(f,n) = \sum_{k = n0}^n (-1)^(n-k) {n \choose k}\cdot f(k) = \Delta^n f,}{% sBn(f,n) = sum(k = n0:n ; (-1)^(n-k) choose(n,k) * f(k)) = \Delta^n f,} see Details for the \eqn{n}-th forward difference operator \eqn{\Delta^n f}. If \code{alternating} is false, the \eqn{(-1)^(n-k)} factor is dropped (or replaced by \eqn{1}) above. Such sums appear in different contexts and are typically challenging, i.e., currently impossible, to evaluate reliably as soon as \eqn{n} is larger than around \eqn{50--70}. } \usage{ sumBinomMpfr(n, f, n0 = 0, alternating = TRUE, precBits = 256, f.k = f(mpfr(k, precBits=precBits))) } \arguments{ \item{n}{upper summation index (integer).} \item{f}{\code{\link{function}} to be evaluated at \eqn{k} for \code{k in n0:n} (and which must return \emph{one} value per \code{k}).} \item{n0}{lower summation index, typically \code{0} (= default) or \code{1}.} \item{alternating}{logical indicating if the sum is alternating, see below.} \item{precBits}{the number of bits for MPFR precision, see \code{\link{mpfr}}.} \item{f.k}{can be specified instead of \code{f} and \code{precBits}, and must contain the equivalent of its default, \code{f(mpfr(k, precBits=precBits))}.} } \details{ The alternating binomial sum \eqn{sB(f,n) := sumBinom(n, f, n0=0)} is equal to the \eqn{n}-th forward difference operator \eqn{\Delta^n f}, \deqn{sB(f,n) = \Delta^n f,} where \deqn{\Delta^n f = \sum_{k=0}^{n} (-1)^{n-k}{n \choose k}\cdot f(k),}{% Delta^n f = sum(k = n0:n ; (-1)^(n-k) choose(n,k) * f(k)),} is the \eqn{n}-fold iterated forward difference \eqn{\Delta f(x) = f(x+1) - f(x)} (for \eqn{x = 0}). The current implementation might be improved in the future, notably for the case where \eqn{sB(f,n)=}\code{sumBinomMpfr(n, f, *)} is to be computed for a whole sequence \eqn{n = 1,\dots,N}{n = 1,...,N}. } %% Now (2012-05-15) have the first version (hidden) as sumBinomMpfr.v1() \value{ an \code{\linkS4class{mpfr}} number of precision \code{precBits}. \eqn{s}. If \code{alternating} is true (as per default), \deqn{s = \sum_{k = n0}^n (-1)^k {n \choose k}\cdot f(k),}{% s = sum(k = n0:n ; (-1)^k choose(n,k) * f(k)),} if \code{alternating} is false, the \eqn{(-1)^k} factor is dropped (or replaced by \eqn{1}) above. } \references{ Wikipedia (2012) The N\"orlund-Rice integral, \url{https://en.wikipedia.org/wiki/Rice_integral} Flajolet, P. and Sedgewick, R. (1995) Mellin Transforms and Asymptotics: Finite Differences and Rice's Integrals, \emph{Theoretical Computer Science} \bold{144}, 101--124. } \author{Martin Maechler, after conversations with Christophe Dutang.} \seealso{ \code{\link{chooseMpfr}}, \code{\link[gmp]{chooseZ}} from package \pkg{gmp}. } \examples{ ## "naive" R implementation: sumBinom <- function(n, f, n0=0, ...) { k <- n0:n sum( choose(n, k) * (-1)^(n-k) * f(k, ...)) } ## compute sumBinomMpfr(.) for a whole set of 'n' values: sumBin.all <- function(n, f, n0=0, precBits = 256, ...) { N <- length(n) precBits <- rep(precBits, length = N) ll <- lapply(seq_len(N), function(i) sumBinomMpfr(n[i], f, n0=n0, precBits=precBits[i], ...)) sapply(ll, as, "double") } sumBin.all.R <- function(n, f, n0=0, ...) sapply(n, sumBinom, f=f, n0=n0, ...) n.set <- 5:80 system.time(res.R <- sumBin.all.R(n.set, f = sqrt)) ## instantaneous.. system.time(resMpfr <- sumBin.all (n.set, f = sqrt)) ## ~ 0.6 seconds \dontshow{ stopifnot( all.equal(resMpfr[1:10], res.R[1:10], tolerance=1e-12), all.equal(resMpfr[1:20], res.R[1:20], tolerance=1e-9 ), all.equal(resMpfr[1:30], res.R[1:30], tolerance=1e-6 )) } matplot(n.set, cbind(res.R, resMpfr), type = "l", lty=1, ylim = extendrange(resMpfr, f = 0.25), xlab = "n", main = "sumBinomMpfr(n, f = sqrt) vs. R double precision") legend("topleft", leg=c("double prec.", "mpfr"), lty=1, col=1:2, bty = "n") } \keyword{arith} Rmpfr/man/seqMpfr.Rd0000644000175000017500000000420413417136645014163 0ustar nileshnilesh\name{seqMpfr} %% This is to contain the "true" seq() methods --- once we can ! --- \Rdversion{1.1} \alias{seqMpfr} \title{"mpfr" Sequence Generation} \description{ Generate \sQuote{regular}, i.e., arithmetic sequences. This is in lieu of methods for \code{\link{seq}} (dispatching on all three of \code{from}, \code{to}, and \code{by}. } \usage{ seqMpfr(from = 1, to = 1, by = ((to - from)/(length.out - 1)), length.out = NULL, along.with = NULL, \dots) } \arguments{ \item{from, to}{the starting and (maximal) end value (numeric or \code{"\linkS4class{mpfr}"}) of the sequence.} \item{by}{number (numeric or \code{"\linkS4class{mpfr}"}): increment of the sequence.} \item{length.out}{desired length of the sequence. A non-negative number, which will be rounded up if fractional.} \item{along.with}{take the length from the length of this argument.} \item{\dots}{arguments passed to or from methods.} } \details{ see \code{\link[base]{seq}} (default method in package \pkg{base}), whose semantic we want to replicate (almost).% not seq(9:6) => seq(4) } \value{ a \sQuote{vector} of class \code{"\linkS4class{mpfr}"}, when one of the first three arguments was. } \author{Martin Maechler} \seealso{ The documentation of the \pkg{base} function \code{\link[base]{seq}}; \code{\link{mpfr}} } \examples{ seqMpfr(0, 1, by = mpfr(0.25, prec=88)) seqMpfr(7, 3) # -> default prec. \dontshow{ eq.test <- function(...) { args <- list(...) r <- do.call(seqMpfr, args) is(r, "mpfr") && all(r == do.call(seq, lapply(args, as.numeric))) } m <- mpfr(8, 60); m2 <- as(2, "mpfr") stopifnot(seqMpfr(7,3) == 7:3, seqMpfr(to=1) == 1, eq.test(pi), eq.test(1,12,3), eq.test(1, by= 2, length= 5), eq.test(1, by=m2, length= 5), eq.test(1, length.out = 8), eq.test(1, length.out = m), eq.test(1, 8, length.out=8), eq.test(1, 8, length.out=m), eq.test(1, m, length.out=m), eq.test(1, m, length.out=8), eq.test(to=17, by= 2, length=4), eq.test(to=17, by=m2, length=4), TRUE) }% {dontshow} -- but test } \keyword{manip} Rmpfr/man/special-math.Rd0000644000175000017500000000421513404502004015075 0ustar nileshnilesh\name{mpfr-special-functions} \alias{zeta} \alias{Ei} \alias{Li2} \alias{erf} \alias{erfc} \title{Special Mathematical Functions (MPFR)} \description{ Special Mathematical Functions, supported by the MPFR Library. } \usage{ zeta(x) Ei(x) Li2(x) erf(x) erfc(x) } \arguments{ \item{x}{a \code{\link{numeric}} or \code{\linkS4class{mpfr}} vector.} } \details{ \code{zeta(x)} computes Riemann's Zeta function \eqn{\zeta(x)}{zeta(x)} important in analytical number theory and related fields. The traditional definition is \deqn{\zeta(x) = \sum_{n=1}^\infty \frac{1}{n^x}.}{Zeta(x) = sum[n=1..Inf; 1/(n^x)].} \code{Ei(x)} computes the \bold{e}xponential integral, \deqn{\int_{-\infty}^{x} \frac{e^t}{t} \; dt.}{Integral(-Inf,x; e^t/t dt).} \code{Li2(x)} computes the dilogarithm, \deqn{\int_{0}^{x} \frac{-log(1-t)}{t} \; dt.}{Integral(0,x; -log(1-t)/t dt).} \code{erf(x)} and \code{erfc(x)} are the error, respectively \bold{c}omplementary error function which are both reparametrizations of \code{\link{pnorm}}, \code{erf(x) = 2*pnorm(sqrt(2)*x)} and \code{erfc(x) = 2* pnorm(sqrt(2)*x, lower=FALSE)}, and hence \pkg{Rmpfr} provides its own version of \code{\link{pnorm}}. } \value{ A vector of the same length as \code{x}, of class \code{\linkS4class{mpfr}}. } % \references{ % } \seealso{\code{\link[stats:Normal]{pnorm}} in standard package \pkg{stats}; the class description \code{\linkS4class{mpfr}} mentioning the generic arithmetic and mathematical functions (\code{sin}, \code{log}, \dots, etc) for which \code{"mpfr"} methods are available. Note the (integer order, non modified) Bessel functions \eqn{j_0()}, \eqn{y_n()}, etc, named \code{\link{j0}, \link{yn}} etc, and Airy function \eqn{Ai()} in \link{Bessel_mpfr}. } \examples{ curve(Ei, 0, 5, n=2001) ## As we now require (mpfrVersion() >= "2.4.0"): curve(Li2, 0, 5, n=2001) curve(Li2, -2, 13, n=2000); abline(h=0,v=0, lty=3) curve(Li2, -200,400, n=2000); abline(h=0,v=0, lty=3) curve(erf, -3,3, col = "red", ylim = c(-1,2)) curve(erfc, add = TRUE, col = "blue") abline(h=0, v=0, lty=3) legend(-3,1, c("erf(x)", "erfc(x)"), col = c("red","blue"), lty=1) } \keyword{math} Rmpfr/man/asNumeric-methods.Rd0000644000175000017500000000325012110004116016105 0ustar nileshnilesh\name{asNumeric-methods} \docType{methods} %% FIXME?? Should this migrate to base ?? --> have implicit generic and S3 generic there! %% ----- there, with semantic storage.mode(x) <- "numeric" \alias{asNumeric-methods} \alias{asNumeric,mpfr-method} \alias{asNumeric,mpfrArray-method} \title{Methods for \code{asNumeric()}} \description{% --> ~/R/Pkgs/gmp/man/asNumeric.Rd Methods for function \code{\link[gmp]{asNumeric}} (in package \pkg{gmp}). } \usage{ %\S4method{asNumeric}{mpfr}(x) \S4method{asNumeric}{mpfrArray}(x) } \arguments{ \item{x}{a \dQuote{number-like} object, here, a \code{\linkS4class{mpfr}} or typically \code{\linkS4class{mpfrArray}}one.} } \section{Methods}{ \describe{ \item{\code{signature(x = "mpfrArray")}}{this method also dispatches for \code{\linkS4class{mpfrMatrix}} and returns a numeric array.} \item{\code{signature(x = "mpfr")}}{for non-array/matrix, \code{asNumeric(x)} is basically the same as \code{as.numeric(x)}.} } } \value{ an \R object of type (\code{\link{typeof}}) \code{"numeric"}, a \code{\link{matrix}} or \code{\link{array}} if \code{x} had non-NULL dimension \code{\link{dim}()}. } \author{Martin Maechler} \seealso{ our lower level (non-generic) \code{\link{toNum}()}. Further, \code{\link[gmp]{asNumeric}} (package \pkg{gmp}), standard \R's \code{\link{as.numeric}()}. } \examples{ x <- (0:7)/8 # (exact) X <- mpfr(x, 99) stopifnot(identical(asNumeric(x), x), identical(asNumeric(X), x)) m <- matrix(1:6, 3,2) (M <- mpfr(m, 99) / 5) ##-> "mpfrMatrix" asNumeric(M) # numeric matrix stopifnot(all.equal(asNumeric(M), m/5), identical(asNumeric(m), m))# remains matrix } \keyword{methods} Rmpfr/man/sapplyMpfr.Rd0000644000175000017500000000267613521340540014701 0ustar nileshnilesh\name{sapplyMpfr} \alias{sapplyMpfr} \title{Apply a Function over a "mpfr" Vector} \description{ Users may be disappointed to note that \code{\link{sapply}()} or \code{\link{vapply}()} typically do not work with \code{"mpfr"} numbers. This is a simple (but strong) approach to work around the problem, based on \code{\link{lapply}()}. Note that this is not yet as flexible as \code{\link{sapply}()} for atomic vectors. } \usage{ sapplyMpfr(X, FUN, \dots) } \arguments{ \item{X}{a vector, possibly of class \code{"\linkS4class{mpfr}"}.} \item{FUN}{a function returning an \code{"\linkS4class{mpfr}"} number. (TODO: A function returning a \emph{vector} of mpfr numbers or even \code{"\linkS4class{mpfrArray}"}).} \item{\dots}{further arguments passed to \code{\link{lapply}}, typically further arguments to \code{FUN}.} } %% \details{ %% } \value{ an \code{"\linkS4class{mpfr}"} vector, typically of the same length as \code{X}. } \author{Martin Maechler} \note{ Another workaround could be to use \preformatted{ res <- lapply(....) sapply(res, asNumeric) } } %% \seealso{ %% \code{\link{..}}, %% } \examples{ ## The function is simply defined as function (X, FUN, ...) new("mpfr", unlist(lapply(X, FUN, ...), recursive = FALSE)) if(require("Bessel")) # here X, is simple bImp <- sapplyMpfr(0:4, function(k) besselI.nuAsym(mpfr(1.31e9, 128), 10, expon.scaled=TRUE, k.max=k)) } \keyword{manip} Rmpfr/src/0000755000175000017500000000000014136173547012274 5ustar nileshnileshRmpfr/src/Ops.c0000644000175000017500000006623514136173306013206 0ustar nileshnilesh/* * MPFR - Multiple Precision Floating-Point Reliable Library * ---- - - - - * * Arithmetic, Math, etc */ #include #include /* imax2() */ #include "Rmpfr_utils.h" extern #include "Syms.h" SEXP Rmpfr_minus(SEXP x) { int n = length(x); SEXP val = PROTECT(duplicate(x)); for(int i=0; i < n; i++) { int sign = asInteger(GET_SLOT(VECTOR_ELT(x,i), Rmpfr_signSym)); SEXP r_i = VECTOR_ELT(val, i); SET_SLOT(r_i, Rmpfr_signSym, ScalarInteger(-sign)); SET_VECTOR_ELT(val, i, r_i); } UNPROTECT(1); return val; } /* Rmpfr_minus() */ SEXP Rmpfr_abs(SEXP x) { int n = length(x); SEXP val = PROTECT(duplicate(x)); for(int i=0; i < n; i++) { SEXP r_i = VECTOR_ELT(val, i); SET_SLOT(r_i, Rmpfr_signSym, ScalarInteger(1)); SET_VECTOR_ELT(val, i, r_i); } UNPROTECT(1); return val; } /* Rmpfr_abs() */ /*------------------------------------------------------------------------*/ SEXP Math_mpfr(SEXP x, SEXP op) { #ifdef using_Data_slot SEXP D = PROTECT(GET_SLOT(x, Rmpfr_Data_Sym)); #else # define D x #endif mpfr_prec_t current_prec = mpfr_get_default_prec(); int n = length(D), i_op = asInteger(op), i; SEXP val = PROTECT(allocVector(VECSXP, n)); mpfr_t R_i, cum; Rboolean is_cum = (71 <= i_op && i_op <= 74); mpfr_init(R_i); /* with default precision */ if(is_cum) { // cummax, cumsum, ... mpfr_init(cum); switch(i_op) { case 71: /* cummax */ mpfr_set_inf(cum, -1);/* := -Inf */; break; case 72: /* cummin */ mpfr_set_inf(cum, +1);/* := +Inf */; break; case 73: /* cumprod */ mpfr_set_d(cum, 1., MPFR_RNDZ);/* := 1 */; break; case 74: /* cumsum */ mpfr_set_d(cum, 0., MPFR_RNDZ);/* := 0 */; break; } } for(i=0; i < n; i++) { R_asMPFR(VECTOR_ELT(D, i), R_i); if(is_cum) { /* hence using cum */ mpfr_prec_t i_prec = mpfr_get_prec(R_i); if(current_prec < i_prec) /* increase precision */ { current_prec = i_prec; mpfr_prec_round(cum, i_prec, MPFR_RNDN); } } #define NOT_YET error("Math op. %d not yet implemented", i_op) switch(i_op) { /* Note we assign use R_i as "input and output" ==> *same* precision, even though in some cases the result may need higher precision */ case 0: /* trunc */ mpfr_trunc(R_i, R_i); break; case 1: /* floor */ mpfr_floor(R_i, R_i); break; case 2: /* ceiling*/ mpfr_ceil(R_i, R_i); break; case 3: /* sqrt */ mpfr_sqrt(R_i, R_i, MPFR_RNDN); break; case 4: /* sign */ error("'sign' is dealt with in R. Should not happen, please report"); break; case 10: /* exp */ mpfr_exp(R_i, R_i, MPFR_RNDN); break; case 11: /* expm1 */ mpfr_expm1(R_i, R_i, MPFR_RNDN); break; case 12: /* log1p */ mpfr_log1p(R_i, R_i, MPFR_RNDN); break; case 13: /* log */ mpfr_log (R_i, R_i, MPFR_RNDN); break; case 14: /* log2 */ mpfr_log2 (R_i, R_i, MPFR_RNDN); break; case 15: /* log10 */ mpfr_log10(R_i, R_i, MPFR_RNDN); break; case 20: /* cos */ mpfr_cos (R_i, R_i, MPFR_RNDN); break; case 21: /* sin */ mpfr_sin (R_i, R_i, MPFR_RNDN); break; case 22: /* tan */ mpfr_tan (R_i, R_i, MPFR_RNDN); break; case 23: /* acos */ mpfr_acos (R_i, R_i, MPFR_RNDN); break; case 24: /* asin */ mpfr_asin (R_i, R_i, MPFR_RNDN); break; case 25: /* atan */ mpfr_atan (R_i, R_i, MPFR_RNDN); break; case 30: /* cosh */ mpfr_cosh (R_i, R_i, MPFR_RNDN); break; case 31: /* sinh */ mpfr_sinh (R_i, R_i, MPFR_RNDN); break; case 32: /* tanh */ mpfr_tanh (R_i, R_i, MPFR_RNDN); break; case 33: /* acosh */ mpfr_acosh(R_i, R_i, MPFR_RNDN); break; case 34: /* asinh */ mpfr_asinh(R_i, R_i, MPFR_RNDN); break; case 35: /* atanh */ mpfr_atanh(R_i, R_i, MPFR_RNDN); break; case 40: /* lgamma */ { int sgn[1]; mpfr_lgamma(R_i, sgn, R_i, MPFR_RNDN); break; } case 41: /* gamma */ mpfr_gamma(R_i, R_i, MPFR_RNDN); break; case 42: /* digamma */ #if (MPFR_VERSION < MPFR_VERSION_NUM(3,0,0)) error("digamma() not implemented in oldish MPFR library version '%s'", MPFR_VERSION_STRING); #else mpfr_digamma(R_i, R_i, MPFR_RNDN); break; #endif case 43: /* trigamma */ NOT_YET; break; case 47: /* cospi */ { mpfr_prec_t i_prec = mpfr_get_prec(R_i); mpfr_t tmp; mpfr_init2(tmp, i_prec); mpfr_abs(R_i, R_i, MPFR_RNDN); // R_i := | R_i | mpfr_set_si(tmp, (long) 2, MPFR_RNDN); // tmp := 2 // R_i := R_i mod 2 : mpfr_fmod(R_i, R_i, tmp, MPFR_RNDN); if(mpfr_cmp_d(R_i, 0.5) == 0 || mpfr_cmp_d(R_i, 1.5) == 0) mpfr_set_zero(R_i, +1); else if(mpfr_cmp_si(R_i, (long) 1) == 0) mpfr_set_si(R_i, (long) -1, MPFR_RNDN); else if(mpfr_cmp_si(R_i, (long) 0) == 0) mpfr_set_si(R_i, (long) 1, MPFR_RNDN); else { // otherwise return cos(pi * x): mpfr_const_pi (tmp, MPFR_RNDN); mpfr_mul(R_i, R_i, tmp, MPFR_RNDN); mpfr_cos(R_i, R_i, MPFR_RNDN); } break; } case 48: /* sinpi */ { mpfr_prec_t i_prec = mpfr_get_prec(R_i); mpfr_t tmp; mpfr_init2(tmp, i_prec); mpfr_set_si(tmp, (long) 2, MPFR_RNDN); // tmp := 2 // R_i := R_i mod 2 : mpfr_fmod(R_i, R_i, tmp, MPFR_RNDN); // map (-2,2) --> (-1,1] : if(mpfr_cmp_si(R_i, (long) -1) <= 0) mpfr_add(R_i, R_i, tmp, MPFR_RNDN); else if(mpfr_cmp_si(R_i, (long) 1) > 0) mpfr_sub(R_i, R_i, tmp, MPFR_RNDN); if(mpfr_integer_p(R_i)) // x = 0 or 1 : ==> sin(pi*x) = 0 mpfr_set_zero(R_i, +1); else if(mpfr_cmp_d(R_i, 0.5) == 0) mpfr_set_si(R_i, (long) 1, MPFR_RNDN); else if(mpfr_cmp_d(R_i, -0.5) == 0) mpfr_set_si(R_i, (long) -1, MPFR_RNDN); else { // otherwise return sin(pi * x): mpfr_const_pi (tmp, MPFR_RNDN); mpfr_mul(R_i, R_i, tmp, MPFR_RNDN); mpfr_sin(R_i, R_i, MPFR_RNDN); } break; } case 49: /* tanpi */ { mpfr_prec_t i_prec = mpfr_get_prec(R_i); mpfr_t tmp; mpfr_init2(tmp, i_prec); mpfr_set_si(tmp, (long) 1, MPFR_RNDN); // tmp := 1 // R_i := R_i mod 1 : mpfr_fmod(R_i, R_i, tmp, MPFR_RNDN); // map (-1,1) --> (-1/2, 1/2] : if(mpfr_cmp_d(R_i, (double) -0.5) <= 0) mpfr_add(R_i, R_i, tmp, MPFR_RNDN); else if(mpfr_cmp_d(R_i, (double) 0.5) > 0) mpfr_sub(R_i, R_i, tmp, MPFR_RNDN); if(mpfr_zero_p(R_i)) // x = 0 : ==> tan(pi*x) = 0 mpfr_set_zero(R_i, +1); else if(mpfr_cmp_d(R_i, 0.5) == 0) mpfr_set_si(R_i, (long) 1, MPFR_RNDN); else if(mpfr_cmp_d(R_i, -0.5) == 0) mpfr_set_si(R_i, (long) -1, MPFR_RNDN); else { // otherwise return tan(pi * x): mpfr_const_pi (tmp, MPFR_RNDN); mpfr_mul(R_i, R_i, tmp, MPFR_RNDN); mpfr_tan(R_i, R_i, MPFR_RNDN); } break; } case 71: /* cummax */ mpfr_max(cum, cum, R_i, MPFR_RNDN); break; case 72: /* cummin */ mpfr_min(cum, cum, R_i, MPFR_RNDN); break; case 73: /* cumprod*/ mpfr_mul(cum, cum, R_i, MPFR_RNDN); break; case 74: /* cumsum */ mpfr_add(cum, cum, R_i, MPFR_RNDN); break; /*--- more functions from the mpfr - library but not in R "Math" : ---*/ case 101: mpfr_erf (R_i, R_i, MPFR_RNDN); break; case 102: mpfr_erfc(R_i, R_i, MPFR_RNDN); break; case 104: mpfr_zeta(R_i, R_i, MPFR_RNDN); break; case 106: mpfr_eint(R_i, R_i, MPFR_RNDN); break; case 107: #if (MPFR_VERSION < MPFR_VERSION_NUM(2,4,0)) error("Li2() not implemented in oldish MPFR library version '%s'", MPFR_VERSION_STRING); #else mpfr_li2 (R_i, R_i, MPFR_RNDN); break; #endif case 111: mpfr_j0(R_i, R_i, MPFR_RNDN); break; case 112: mpfr_j1(R_i, R_i, MPFR_RNDN); break; case 113: mpfr_y0(R_i, R_i, MPFR_RNDN); break; case 114: mpfr_y1(R_i, R_i, MPFR_RNDN); break; case 120: #if (MPFR_VERSION < MPFR_VERSION_NUM(3,0,0)) error("Ai() not implemented in oldish MPFR library version '%s'", MPFR_VERSION_STRING); #else mpfr_ai(R_i, R_i, MPFR_RNDN); break; #endif default: error("invalid op code (%d) in Math_mpfr", i_op); } // end{switch()} if(is_cum) SET_VECTOR_ELT(val, i, MPFR_as_R(cum)); else SET_VECTOR_ELT(val, i, MPFR_as_R(R_i)); } mpfr_clear (R_i); if(is_cum) mpfr_clear(cum); mpfr_free_cache(); #ifdef using_Data_slot UNPROTECT(2); #else UNPROTECT(1); #endif return val; } /* Math_mpfr() */ #undef NOT_YET // %% operator -- do what R does: ~/R/D/r-devel/R/src/main/arithmetic.c // ----- --> it uses %% (only sometimes!) and myfmod(); // .... ok, now checked in ../tests/arith-ex.R // ~~~~~~~~~~~~~~~~~~~ // CARE: caller can use R_mpfr_mod(x, x, y) -- i.e., r == x as pointers! static int R_mpfr_mod(mpfr_t r, mpfr_t x, mpfr_t y, mpfr_rnd_t RND) { if(mpfr_nan_p(y) || mpfr_nan_p(x)) { mpfr_set_nan(r); return 0; } int s_y = mpfr_sgn(y);// --> {-1, 0, 1} if(s_y == 0) { // y = 0 |-> NaN : mpfr_set_nan(r); return 0; } int s = mpfr_fmod(r, x, y, RND);// CARE: if(r is x) will thrash x if((s_y > 0 && mpfr_sgn(r) < 0) || // as R : (-5) %% 3 |--> 1 (s_y < 0 && mpfr_sgn(r) > 0)) // as R : 5 %% (-3) |--> -1 s += mpfr_add(r, r, y, RND); return s; } SEXP Arith_mpfr(SEXP x, SEXP y, SEXP op) { #ifdef using_Data_slot SEXP xD = PROTECT(GET_SLOT(x, Rmpfr_Data_Sym)), yD = PROTECT(GET_SLOT(y, Rmpfr_Data_Sym)); #else # define xD x # define yD y #endif int nx = length(xD), ny = length(yD), i_op = asInteger(op), i, n = (nx == 0 || ny == 0) ? 0 : imax2(nx, ny), mismatch = 0; SEXP val = PROTECT(allocVector(VECSXP, n)); mpfr_t x_i, y_i; mpfr_init(x_i); /* with default precision */ mpfr_init(y_i); SET_MISMATCH; for(i=0; i < n; i++) { mpfr_prec_t x_prec, y_prec; R_asMPFR(VECTOR_ELT(xD, i % nx), x_i); x_prec = mpfr_get_prec(x_i); R_asMPFR(VECTOR_ELT(yD, i % ny), y_i); y_prec = mpfr_get_prec(y_i); if(x_prec < y_prec) {/* increase it, since it will store the result */ mpfr_prec_round (x_i, y_prec, MPFR_RNDN); x_prec = y_prec; } switch(i_op) { /* Note we assign use x_i as "input and output" ==> *same* precision, even though in some cases the result may need higher precision */ case 1: /* + */ mpfr_add (x_i, x_i, y_i, MPFR_RNDN); break; case 2: /* - */ mpfr_sub (x_i, x_i, y_i, MPFR_RNDN); break; case 3: /* * */ mpfr_mul (x_i, x_i, y_i, MPFR_RNDN); break; case 4: /* ^ */ mpfr_pow (x_i, x_i, y_i, MPFR_RNDN); break; case 5: /* %% */ R_mpfr_mod(x_i, x_i, y_i, MPFR_RNDN); break; case 6: /* %/% */ { mpfr_t r; mpfr_init(r); if(mpfr_get_prec(r) < x_prec) mpfr_set_prec (r, x_prec); // want to ensure x == (x %% y) + y * ( x %/% y ) // <==> x - (x %% y) == y * ( x %/% y ) // <==> [ x - (x %% y) ] / y == ( x %/% y ) R_mpfr_mod(r, x_i, y_i, MPFR_RNDN);// r := x %% y, mpfr_sub (x_i, x_i, r, MPFR_RNDN); // x~ = x - r = x - (x %% y) mpfr_div (x_i, x_i,y_i,MPFR_RNDN); // x = x~ / y = (x - (x %% y))/y mpfr_clear(r); break; } case 7: /* / */ mpfr_div(x_i, x_i, y_i, MPFR_RNDN); break; default: error("invalid op code (%d) in Arith_mpfr", i_op); } SET_VECTOR_ELT(val, i, MPFR_as_R(x_i)); } MISMATCH_WARN; mpfr_clear (x_i); mpfr_clear (y_i); mpfr_free_cache(); #ifdef using_Data_slot UNPROTECT(3); #else UNPROTECT(1); #endif return val; } /* Arith_mpfr */ SEXP Arith_mpfr_i(SEXP x, SEXP y, SEXP op) { #ifdef using_Data_slot SEXP xD = PROTECT(GET_SLOT(x, Rmpfr_Data_Sym)); #else # define xD x #endif int *yy = INTEGER(y); int nx = length(xD), ny = length(y), i_op = asInteger(op), i, n = (nx == 0 || ny == 0) ? 0 : imax2(nx, ny), mismatch = 0; if(TYPEOF(y) != INTSXP) error("Arith[%d](mpfr,i): 'y' is not a \"integer\"", i_op); SEXP val = PROTECT(allocVector(VECSXP, n)); mpfr_t x_i; mpfr_init(x_i); /* with default precision */ SET_MISMATCH; for(i=0; i < n; i++) { int i_ = i % ny; R_asMPFR(VECTOR_ELT(xD, i % nx), x_i); switch(i_op) { /* Note we assign use x_i as "input and output" ==> *same* precision, even though in some cases the result may need higher precision */ case 1: /* + */ mpfr_add_si(x_i, x_i, (long) yy[i_], MPFR_RNDN); break; case 2: /* - */ mpfr_sub_si(x_i, x_i, (long) yy[i_], MPFR_RNDN); break; case 3: /* * */ mpfr_mul_si(x_i, x_i, (long) yy[i_], MPFR_RNDN); break; case 4: /* ^ */ mpfr_pow_si(x_i, x_i, (long) yy[i_], MPFR_RNDN); break; case 5: /* %% */ { mpfr_t yy_i; mpfr_init_set_si(yy_i, (long) yy[i_], MPFR_RNDN); R_mpfr_mod(x_i, x_i, yy_i, MPFR_RNDN); mpfr_clear(yy_i); break; } case 6: /* %/% */ { mpfr_t r, yy_i; mpfr_init(r); mpfr_prec_t x_prec = mpfr_get_prec(x_i); if(mpfr_get_prec(r) < x_prec) mpfr_set_prec (r, x_prec); mpfr_init_set_si(yy_i, (long) yy[i_], MPFR_RNDN); R_mpfr_mod(r, x_i, yy_i, MPFR_RNDN); mpfr_sub (x_i, x_i, r, MPFR_RNDN); // x~ = x - r = x - (x %% y) mpfr_div (x_i, x_i,yy_i,MPFR_RNDN); // x = x~ / y = (x - (x %% y))/y mpfr_clear(r); mpfr_clear(yy_i); break; } case 7: /* / */ mpfr_div_si(x_i, x_i, (long) yy[i_], MPFR_RNDN); break; default: error("invalid op code (%d) in Arith_mpfr", i_op); } SET_VECTOR_ELT(val, i, MPFR_as_R(x_i)); } MISMATCH_WARN; mpfr_clear (x_i); mpfr_free_cache(); #ifdef using_Data_slot UNPROTECT(2); #else UNPROTECT(1); #endif return val; } /* Arith_mpfr_i */ SEXP Arith_i_mpfr(SEXP x, SEXP y, SEXP op) { #ifdef using_Data_slot SEXP yD = PROTECT(GET_SLOT(y, Rmpfr_Data_Sym)); #else # define yD y #endif int *xx = INTEGER(x); int nx = length(x), ny = length(yD), i_op = asInteger(op), i, n = (nx == 0 || ny == 0) ? 0 : imax2(nx, ny), mismatch = 0; if(TYPEOF(x) != INTSXP) error("Arith[%d](i,mpfr): 'x' is not a \"integer\"", i_op); SEXP val = PROTECT(allocVector(VECSXP, n)); mpfr_t y_i; mpfr_init(y_i); /* with default precision */ SET_MISMATCH; for(i=0; i < n; i++) { int i_ = i % nx; R_asMPFR(VECTOR_ELT(yD, i % ny), y_i); switch(i_op) { /* Note we assign use y_i as "input and output" ==> *same* precision, even though in some cases the result may need higher precision */ case 1: /* + */ mpfr_add_si(y_i, y_i, (long) xx[i_], MPFR_RNDN); break; case 2: /* - */ mpfr_si_sub(y_i, (long) xx[i_], y_i, MPFR_RNDN); break; case 3: /* * */ mpfr_mul_si(y_i, y_i, (long) xx[i_], MPFR_RNDN); break; case 4: /* ^ */ { #define R_MPFR_SI_POW(_XXI, _YI) \ long _x = (long) _XXI; \ if(_x >= 0) \ mpfr_ui_pow(_YI, (unsigned long) _x, _YI, MPFR_RNDN); \ else if(mpfr_integer_p(_YI)) { /* ^ */ \ mpfr_ui_pow(_YI, (unsigned long) -_x, _YI, MPFR_RNDN); \ mpfr_neg(_YI, _YI, MPFR_RNDN); \ } \ else /* ^ |-> NaN : */ \ mpfr_set_nan (_YI); \ break R_MPFR_SI_POW(xx[i_], y_i); } case 5: /* %% */ { mpfr_t xx_i, r; mpfr_init_set_si(xx_i, (long) xx[i_], MPFR_RNDN); mpfr_init(r); R_mpfr_mod(r, xx_i, y_i, MPFR_RNDN); mpfr_set(y_i, r, MPFR_RNDN); mpfr_clear(r); mpfr_clear(xx_i); break; } case 6: /* %/% */ { mpfr_t r, xx_i; mpfr_init(r); mpfr_prec_t y_prec = mpfr_get_prec(y_i); if(mpfr_get_prec(r) < y_prec) mpfr_set_prec (r, y_prec); mpfr_init_set_si(xx_i, (long) xx[i_], MPFR_RNDN); R_mpfr_mod(r, xx_i, y_i, MPFR_RNDN); mpfr_sub (xx_i,xx_i, r, MPFR_RNDN); // x~ = x - r = x - (x %% y) mpfr_div (y_i, xx_i,y_i,MPFR_RNDN); // y = x~ / y = (x - (x %% y))/y mpfr_clear(r); mpfr_clear(xx_i); break; } case 7: /* / */ mpfr_si_div(y_i, (long) xx[i_], y_i, MPFR_RNDN); break; default: error("invalid op code (%d) in Arith_mpfr", i_op); } SET_VECTOR_ELT(val, i, MPFR_as_R(y_i)); } MISMATCH_WARN; mpfr_clear (y_i); mpfr_free_cache(); #ifdef using_Data_slot UNPROTECT(2); #else UNPROTECT(1); #endif return val; } /* Arith_i_mpfr */ SEXP Arith_mpfr_d(SEXP x, SEXP y, SEXP op) { #ifdef using_Data_slot SEXP xD = PROTECT(GET_SLOT(x, Rmpfr_Data_Sym)); #else # define xD x #endif double *yy = REAL(y); int nx = length(xD), ny = length(y), i_op = asInteger(op), i, n = (nx == 0 || ny == 0) ? 0 : imax2(nx, ny), mismatch = 0; if(TYPEOF(y) != REALSXP) error("Arith[%d](mpfr,d): 'y' is not a \"double\"", i_op); SEXP val = PROTECT(allocVector(VECSXP, n)); mpfr_t x_i, yy_i; mpfr_init(x_i); mpfr_init(yy_i); /* with default precision */ SET_MISMATCH; for(i=0; i < n; i++) { double yi = yy[i % ny]; /* this fails for yi = 'dOO <- 9223372036854775808', see ../tests/arith-ex.R , * (because in double precision 9223372036854775807 == 9223372036854775808 !!): * int y_is_int = (yi == trunc(yi) && LONG_MIN <= yi && yi <= LONG_MAX); ==> use '<' instead of '<=' twice ! */ int y_is_int = (yi == trunc(yi) && LONG_MIN < yi && yi < LONG_MAX); R_asMPFR(VECTOR_ELT(xD, i % nx), x_i); if(y_is_int) { /* can use o routines */ #ifdef DEBUG_Rmpfr REprintf("yi: %.20g, (long)yi: %ld; yi is int. in [L_MIN, L_MAX]=[%ld,%ld]\n", yi, (long)yi, LONG_MIN, LONG_MAX); #endif switch(i_op) { case 1: /* + */ mpfr_add_si(x_i, x_i, (long)yi, MPFR_RNDN); break; case 2: /* - */ mpfr_sub_si(x_i, x_i, (long)yi, MPFR_RNDN); break; case 3: /* * */ mpfr_mul_si(x_i, x_i, (long)yi, MPFR_RNDN); break; case 4: /* ^ */ mpfr_pow_si(x_i, x_i, (long)yi, MPFR_RNDN); break; case 5: /* %% */ { mpfr_set_si(yy_i, (long)yi, MPFR_RNDN); R_mpfr_mod(x_i, x_i, yy_i, MPFR_RNDN); break; } case 6: /* %/% */ { mpfr_t r; mpfr_init(r); mpfr_prec_t x_prec = mpfr_get_prec(x_i); if(mpfr_get_prec(r) < x_prec) mpfr_set_prec (r, x_prec); mpfr_set_si(yy_i, (long) yi, MPFR_RNDN); R_mpfr_mod(r, x_i, yy_i, MPFR_RNDN); mpfr_sub (x_i, x_i, r, MPFR_RNDN); // x~ = x - r = x - (x %% y) mpfr_div (x_i, x_i, yy_i, MPFR_RNDN); // x = x~ / y = (x - (x %% y))/y mpfr_clear(r); break; } case 7: /* / */ mpfr_div_si(x_i, x_i, (long)yi, MPFR_RNDN); break; default: error("invalid op code (%d) in Arith_mpfr_d", i_op); } } else { mpfr_set_d (yy_i, yi, MPFR_RNDD); switch(i_op) { /* Note we assign use x_i as "input and output" ==> *same* precision, even though in some cases the result may need higher precision */ case 1: /* + */ mpfr_add(x_i, x_i, yy_i, MPFR_RNDN); break; case 2: /* - */ mpfr_sub(x_i, x_i, yy_i, MPFR_RNDN); break; case 3: /* * */ mpfr_mul(x_i, x_i, yy_i, MPFR_RNDN); break; case 4: /* ^ */ mpfr_pow(x_i, x_i, yy_i, MPFR_RNDN); break; case 5: /* %% */ R_mpfr_mod(x_i, x_i, yy_i, MPFR_RNDN); break; case 6: /* %/% */ { mpfr_t r; mpfr_init(r); mpfr_prec_t x_prec = mpfr_get_prec(x_i); if(mpfr_get_prec(r) < x_prec) mpfr_set_prec (r, x_prec); R_mpfr_mod(r, x_i, yy_i, MPFR_RNDN); mpfr_sub (x_i, x_i, r, MPFR_RNDN); // x~ = x - r = x - (x %% y) mpfr_div (x_i, x_i, yy_i, MPFR_RNDN); // x = x~ / y = (x - (x %% y))/y mpfr_clear(r); break; } case 7: /* / */ mpfr_div(x_i, x_i, yy_i, MPFR_RNDN); break; default: error("invalid op code (%d) in Arith_mpfr_d", i_op); } } SET_VECTOR_ELT(val, i, MPFR_as_R(x_i)); } MISMATCH_WARN; mpfr_clear (x_i); mpfr_clear (yy_i); mpfr_free_cache(); #ifdef using_Data_slot UNPROTECT(2); #else UNPROTECT(1); #endif return val; } /* Arith_mpfr_d */ SEXP Arith_d_mpfr(SEXP x, SEXP y, SEXP op) { #ifdef using_Data_slot SEXP yD = PROTECT(GET_SLOT(y, Rmpfr_Data_Sym)); #else # define yD y #endif double *xx = REAL(x); int nx = length(x), ny = length(yD), i_op = asInteger(op), i, n = (nx == 0 || ny == 0) ? 0 : imax2(nx, ny), mismatch = 0; if(TYPEOF(x) != REALSXP) error("Arith[%d](d,mpfr): 'x' is not a \"double\"", i_op); SEXP val = PROTECT(allocVector(VECSXP, n)); mpfr_t y_i; mpfr_init(y_i); SET_MISMATCH; for(i=0; i < n; i++) { double xi = xx[i % nx]; int x_is_int = (xi == trunc(xi) && LONG_MIN <= xi && xi <= LONG_MAX); R_asMPFR(VECTOR_ELT(yD, i % ny), y_i); if(x_is_int) { /* can use o routines */ /* REprintf("x[i] (= %g) is int: (long)* = %ld\n", xi, (long)xi); */ switch(i_op) { case 1: /* + */ mpfr_add_si(y_i, y_i, (long)xi, MPFR_RNDN); break; case 2: /* - */ mpfr_si_sub(y_i, (long)xi, y_i, MPFR_RNDN); break; case 3: /* * */ mpfr_mul_si(y_i, y_i, (long)xi, MPFR_RNDN); break; case 4: /* ^ */ { R_MPFR_SI_POW((long)xi, y_i); } case 5: /* %% */ { mpfr_t xx_i, r; mpfr_init_set_si(xx_i, (long)xi, MPFR_RNDN); mpfr_init(r); R_mpfr_mod(r, xx_i, y_i, MPFR_RNDN); mpfr_set(y_i, r, MPFR_RNDN); mpfr_clear(r); mpfr_clear(xx_i); break; } case 6: /* %/% */ { mpfr_t r, xx_i; mpfr_init(r); mpfr_prec_t y_prec = mpfr_get_prec(y_i); if(mpfr_get_prec(r) < y_prec) mpfr_set_prec (r, y_prec); mpfr_init_set_si(xx_i, (long) xi, MPFR_RNDN); R_mpfr_mod(r, xx_i, y_i, MPFR_RNDN); mpfr_sub (xx_i,xx_i, r, MPFR_RNDN); // x~ = x - r = x - (x %% y) mpfr_div (y_i, xx_i, y_i, MPFR_RNDN); // y = x~ / y = (x - (x %% y))/y mpfr_clear(r); mpfr_clear(xx_i); break; } case 7: /* / */ mpfr_si_div(y_i, (long)xi, y_i, MPFR_RNDN); break; default: error("invalid op code (%d) in Arith_d_mpfr", i_op); } } else { mpfr_t xx_i; mpfr_init_set_d (xx_i, xi, MPFR_RNDD); switch(i_op) { /* Note we assign use y_i as "input and output" ==> *same* precision, even though in some cases the result may need higher precision */ case 1: /* + */ mpfr_add(y_i, xx_i, y_i, MPFR_RNDN); break; case 2: /* - */ mpfr_sub(y_i, xx_i, y_i, MPFR_RNDN); break; case 3: /* * */ mpfr_mul(y_i, xx_i, y_i, MPFR_RNDN); break; case 4: /* ^ */ mpfr_pow(y_i, xx_i, y_i, MPFR_RNDN); break; case 5: /* %% */ { mpfr_t r; mpfr_init(r); R_mpfr_mod(r, xx_i, y_i, MPFR_RNDN); mpfr_set(y_i, r, MPFR_RNDN); mpfr_clear(r); break; } case 6: /* %/% */ { mpfr_t r; mpfr_init(r); mpfr_prec_t y_prec = mpfr_get_prec(y_i); if(mpfr_get_prec(r) < y_prec) mpfr_set_prec (r, y_prec); R_mpfr_mod(r, xx_i, y_i, MPFR_RNDN); mpfr_sub (xx_i,xx_i, r, MPFR_RNDN); // x~ = x - r = x - (x %% y) mpfr_div (y_i, xx_i, y_i, MPFR_RNDN); // y = x~ / y = (x - (x %% y))/y mpfr_clear(r); break; } case 7: /* / */ mpfr_div(y_i, xx_i, y_i, MPFR_RNDN); break; default: error("invalid op code (%d) in Arith_d_mpfr", i_op); } mpfr_clear(xx_i); } SET_VECTOR_ELT(val, i, MPFR_as_R(y_i)); } MISMATCH_WARN; mpfr_clear (y_i); mpfr_free_cache(); #ifdef using_Data_slot UNPROTECT(2); #else UNPROTECT(1); #endif return val; } /* Arith_d_mpfr */ SEXP Compare_mpfr(SEXP x, SEXP y, SEXP op) { #ifdef using_Data_slot SEXP xD = PROTECT(GET_SLOT(x, Rmpfr_Data_Sym)), yD = PROTECT(GET_SLOT(y, Rmpfr_Data_Sym)); #else # define xD x # define yD y #endif int nx = length(xD), ny = length(yD), i_op = asInteger(op), i, n = (nx == 0 || ny == 0) ? 0 : imax2(nx, ny), mismatch = 0; SEXP val = PROTECT(allocVector(LGLSXP, n)); int *r = LOGICAL(val); mpfr_t x_i, y_i; mpfr_init(x_i); /* with default precision */ mpfr_init(y_i); /* with default precision */ SET_MISMATCH; for(i=0; i < n; i++) { R_asMPFR(VECTOR_ELT(xD, i % nx), x_i); R_asMPFR(VECTOR_ELT(yD, i % ny), y_i); switch(i_op) { case 1: /* == */ r[i] = mpfr_equal_p(x_i, y_i); break; case 2: /* > */ r[i] = mpfr_greater_p(x_i, y_i); break; case 3: /* < */ r[i] = mpfr_less_p(x_i, y_i); break; case 4: /* != */ r[i] = mpfr_lessgreater_p(x_i, y_i); break; case 5: /* <= */ r[i] = mpfr_lessequal_p(x_i, y_i); break; case 6: /* >= */ r[i] = mpfr_greaterequal_p(x_i, y_i); break; default: error("invalid op code (%d) in Compare_mpfr", i_op); } } MISMATCH_WARN; mpfr_clear (x_i); mpfr_clear (y_i); mpfr_free_cache(); #ifdef using_Data_slot UNPROTECT(3); #else UNPROTECT(1); #endif return val; } /* Compare_mpfr */ SEXP Compare_mpfr_i(SEXP x, SEXP y, SEXP op) { #ifdef using_Data_slot SEXP xD = PROTECT(GET_SLOT(x, Rmpfr_Data_Sym)); #else # define xD x #endif int *yy = INTEGER(y); int nx = length(xD), ny = length(y), i_op = asInteger(op), i, n = (nx == 0 || ny == 0) ? 0 : imax2(nx, ny), mismatch = 0; SEXP val = PROTECT(allocVector(LGLSXP, n)); int *r = LOGICAL(val); mpfr_t x_i; mpfr_init(x_i); SET_MISMATCH; for(i=0; i < n; i++) { int yi = yy[i % ny], c; R_asMPFR(VECTOR_ELT(xD, i % nx), x_i); c = mpfr_cmp_si(x_i, (long) yi);/* gives c > or == or < 0 */ if(c == 0 && /* also includes case where an operand is NaN */ (yi == NA_INTEGER || mpfr_nan_p(x_i))) { r[i] = NA_LOGICAL; } else { switch(i_op) { case 1: /* == */ r[i] = (c == 0); break; case 2: /* > */ r[i] = (c > 0); break; case 3: /* < */ r[i] = (c < 0); break; case 4: /* != */ r[i] = (c != 0); break; case 5: /* <= */ r[i] = (c <= 0); break; case 6: /* >= */ r[i] = (c >= 0); break; default: error("invalid op code (%d) in Compare_mpfr_i", i_op); } } } MISMATCH_WARN; mpfr_clear (x_i); mpfr_free_cache(); #ifdef using_Data_slot UNPROTECT(2); #else UNPROTECT(1); #endif return val; } /* Compare_mpfr_i */ SEXP Compare_mpfr_d(SEXP x, SEXP y, SEXP op) { #ifdef using_Data_slot SEXP xD = PROTECT(GET_SLOT(x, Rmpfr_Data_Sym)); #else # define xD x #endif double *yy = REAL(y); int nx = length(xD), ny = length(y), i_op = asInteger(op), i, n = (nx == 0 || ny == 0) ? 0 : imax2(nx, ny), mismatch = 0; SEXP val = PROTECT(allocVector(LGLSXP, n)); int *r = LOGICAL(val); mpfr_t x_i; mpfr_init(x_i); SET_MISMATCH; for(i=0; i < n; i++) { double yi = yy[i % ny]; int c; R_asMPFR(VECTOR_ELT(xD, i % nx), x_i); c = mpfr_cmp_d(x_i, yi);/* gives c > or == or < 0 */ if(c == 0 && /* also includes case where an operand is NaN */ (ISNAN(yi) || mpfr_nan_p(x_i))) { r[i] = NA_LOGICAL; } else { switch(i_op) { case 1: /* == */ r[i] = (c == 0); break; case 2: /* > */ r[i] = (c > 0); break; case 3: /* < */ r[i] = (c < 0); break; case 4: /* != */ r[i] = (c != 0); break; case 5: /* <= */ r[i] = (c <= 0); break; case 6: /* >= */ r[i] = (c >= 0); break; default: error("invalid op code (%d) in Compare_mpfr_d", i_op); } } } MISMATCH_WARN; mpfr_clear (x_i); mpfr_free_cache(); #ifdef using_Data_slot UNPROTECT(2); #else UNPROTECT(1); #endif return val; } /* Compare_mpfr_d */ #ifdef __NOT_ANY_MORE__ /* Not really used anymore : */ #define INIT_1_SETUP(_X_, _R_) \ mpfr_t _R_; \ \ mpfr_init2(_R_, R_mpfr_prec(_X_)); \ R_asMPFR(_X_, _R_) #define FINISH_1_RETURN(_R_, val) \ val = PROTECT(MPFR_as_R(_R_)); \ mpfr_clear (_R_); \ mpfr_free_cache(); \ UNPROTECT(1); \ return val SEXP exp_mpfr1(SEXP x) { SEXP val; INIT_1_SETUP(x, r); mpfr_exp(r, r, MPFR_RNDN); /* - - ((result may need higher precision)) .. */ FINISH_1_RETURN(r, val); } SEXP log_mpfr1(SEXP x) { SEXP val; INIT_1_SETUP(x, r); mpfr_log(r, r, MPFR_RNDN); FINISH_1_RETURN(r, val); } /* Unused */ #define INIT_2_SETUP(_X_, _R_, _S_) \ mpfr_t _R_, _S_; \ \ mpfr_init2(_R_, R_mpfr_prec(_X_)); \ /* _S_ should get same precision as _R_ :*/ \ mpfr_init2(_S_, mpfr_get_prec(_R_)); \ R_asMPFR(_X_, _R_) #define FINISH_2_RETURN(_R_, _S_, val) \ val = PROTECT(MPFR_as_R(_R_)); \ mpfr_clear(_R_); mpfr_clear(_S_); \ mpfr_free_cache(); \ UNPROTECT(1); \ return val #endif /* __NOT_ANY_MORE__ */ Rmpfr/src/Makevars.win0000644000175000017500000000060111253364553014555 0ustar nileshnilesh# -*- Makefile -*- # Link with GMP (GNU Multiple Precision) # and with MPFR (Multiple Precision Floating point Reliable) Libraries # # lines below suggested by Uwe Ligges PKG_CPPFLAGS=-I$(LIB_MPFR)/include PKG_LIBS=-L$(LIB_MPFR)/lib -lmpfr -lgmp ## or rather ? # PKG_CPPFLAGS=-I$(LIB_MPFR)/include -I$(LIB_GMP)/include # PKG_LIBS=-L$(LIB_MPFR)/lib -lmpfr -L$(LIB_GMP)/lib -lgmp Rmpfr/src/utils.c0000644000175000017500000005262514026150166013600 0ustar nileshnilesh/* * MPFR - Multiple Precision Floating-Point Reliable Library * ---- - - - - */ #include /* imax2() */ # include //-> void R_CheckUserInterrupt(void); #include "Rmpfr_utils.h" extern #include "Syms.h" //Dbg: #define DEBUG_Rmpfr #ifdef DEBUG_Rmpfr /* ONLY for debugging !! */ # ifndef WIN32 # include # endif # define R_PRT(_X_) mpfr_out_str (R_Outputfile, 10, 0, _X_, MPFR_RNDD) #endif // Currently not in the API (hence "should be" (?) 'static') : int my_mpfr_beta (mpfr_t ROP, mpfr_t X, mpfr_t Y, mpfr_rnd_t RND); int my_mpfr_lbeta(mpfr_t ROP, mpfr_t X, mpfr_t Y, mpfr_rnd_t RND); int my_mpfr_choose(mpfr_t ROP, long n, mpfr_t X, mpfr_rnd_t RND); int my_mpfr_poch (mpfr_t ROP, long n, mpfr_t X, mpfr_rnd_t RND); int my_mpfr_round (mpfr_t ROP, long prec, mpfr_t X, mpfr_rnd_t RND); /* argument order above must match the one of mpfr_jn() etc .. */ /* MM: for debugging, use gcc -I/u/maechler/R/D/r-patched/F19-64-inst/include -I/usr/local/include -fpic -g -O3 -pedantic -Wall --std=gnu99 -DDEBUG_Rmpfr -Wcast-align -Wclobbered -c utils.c -o utils.o */ /*------------------------------------------------------------------------*/ int my_mpfr_beta (mpfr_t R, mpfr_t a, mpfr_t b, mpfr_rnd_t RND) { mpfr_prec_t p_a = mpfr_get_prec(a), p_b = mpfr_get_prec(b); if(p_a < p_b) p_a = p_b;// p_a := max(p_a, p_b) if(mpfr_get_prec(R) < p_a) mpfr_prec_round(R, p_a, RND);// so prec(R) = max( prec(a), prec(b) ) int ans; mpfr_t s; mpfr_init2(s, p_a); #ifdef DEBUG_Rmpfr R_CheckUserInterrupt(); int cc = 0; #endif /* "FIXME": check each 'ans' below, and return when not ok ... */ ans = mpfr_add(s, a, b, RND); if(mpfr_integer_p(s) && mpfr_sgn(s) <= 0) { // (a + b) is integer <= 0 if(!mpfr_integer_p(a) && !mpfr_integer_p(b)) { // but a,b not integer ==> R = finite / +-Inf = 0 : mpfr_set_zero (R, +1); mpfr_clear (s); return ans; }// else: sum is integer; at least one {a,b} integer ==> both integer int sX = mpfr_sgn(a), sY = mpfr_sgn(b); if(sX * sY < 0) { // one negative, one positive integer // ==> special treatment here : if(sY < 0) // ==> sX > 0; swap the two mpfr_swap(a, b); // now have --- a < 0 < b <= |a| integer ------------------ /* ================ and in this case: B(a,b) = (-1)^b B(1-a-b, b) = (-1)^b B(1-s, b) = (1*2*..*b) / (-s-1)*(-s-2)*...*(-s-b) */ /* where in the 2nd form, both numerator and denominator have exactly * b integer factors. This is attractive {numerically & speed wise} * for 'small' b */ #define b_large 100 #ifdef DEBUG_Rmpfr Rprintf(" my_mpfr_beta(): s = a+b= "); R_PRT(s); Rprintf("\n a = "); R_PRT(a); Rprintf("\n b = "); R_PRT(b); Rprintf("\n"); if(cc++ > 999) { mpfr_set_zero (R, +1); mpfr_clear (s); return ans; } #endif unsigned long b_ = 0;// -Wall Rboolean b_fits_ulong = mpfr_fits_ulong_p(b, RND), small_b = b_fits_ulong && (b_ = mpfr_get_ui(b, RND)) < b_large; if(small_b) { #ifdef DEBUG_Rmpfr Rprintf(" b <= b_large = %d...\n", b_large); #endif //----------------- small b ------------------ // use GMP big integer arithmetic: mpz_t S; mpz_init(S); mpfr_get_z(S, s, RND); // S := s mpz_sub_ui (S, S, (unsigned long) 1); // S = s - 1 = (a+b-1) /* binomial coefficient choose(N, k) requires k a 'long int'; * here, b must fit into a long: */ mpz_bin_ui (S, S, b_); // S = choose(S, b) = choose(a+b-1, b) mpz_mul_ui (S, S, b_); // S = S*b = b * choose(a+b-1, b) // back to mpfr: R = 1 / S = 1 / (b * choose(a+b-1, b)) mpfr_set_ui(s, (unsigned long) 1, RND); mpfr_div_z(R, s, S, RND); mpz_clear(S); } else { // b is "large", use direct B(.,.) formula #ifdef DEBUG_Rmpfr Rprintf(" b > b_large = %d...\n", b_large); #endif // a := (-1)^b : // there is no mpfr_si_pow(a, -1, b, RND); int neg; // := 1 ("TRUE") if (-1)^b = -1, i.e. iff b is odd if(b_fits_ulong) { // (i.e. not very large) neg = (b_ % 2); // 1 iff b_ is odd, 0 otherwise } else { // really large b; as we know it is integer, can still.. // b2 := b / 2 mpfr_t b2; mpfr_init2(b2, p_a); mpfr_div_2ui(b2, b, 1, RND); neg = !mpfr_integer_p(b2); // b is odd, if b/2 is *not* integer #ifdef DEBUG_Rmpfr Rprintf(" really large b; neg = ('b is odd') = %d\n", neg); #endif } // s' := 1-s = 1-a-b mpfr_ui_sub(s, 1, s, RND); #ifdef DEBUG_Rmpfr Rprintf(" neg = %d\n", neg); Rprintf(" s' = 1-a-b = "); R_PRT(s); Rprintf("\n -> calling B(s',b)\n"); #endif // R := B(1-a-b, b) = B(s', b) if(small_b) { my_mpfr_beta (R, s, b, RND); } else { my_mpfr_lbeta (R, s, b, RND); mpfr_exp(R, R, RND); // correct *if* beta() >= 0 } #ifdef DEBUG_Rmpfr Rprintf(" R' = beta(s',b) = "); R_PRT(R); Rprintf("\n"); #endif // Result = (-1)^b B(1-a-b, b) = +/- s' if(neg) mpfr_neg(R, R, RND); } mpfr_clear(s); return ans; } } ans = mpfr_gamma(s, s, RND); /* s = gamma(a + b) */ #ifdef DEBUG_Rmpfr Rprintf("my_mpfr_beta(): s = gamma(a+b)= "); R_PRT(s); Rprintf("\n a = "); R_PRT(a); Rprintf("\n b = "); R_PRT(b); #endif ans = mpfr_gamma(a, a, RND); ans = mpfr_gamma(b, b, RND); ans = mpfr_mul(b, b, a, RND); /* b' = gamma(a) * gamma(b) */ #ifdef DEBUG_Rmpfr Rprintf("\n G(a) * G(b) = "); R_PRT(b); Rprintf("\n"); #endif ans = mpfr_div(R, b, s, RND); mpfr_clear (s); /* mpfr_free_cache() must be called in the caller !*/ return ans; } int my_mpfr_lbeta(mpfr_t R, mpfr_t a, mpfr_t b, mpfr_rnd_t RND) { mpfr_prec_t p_a = mpfr_get_prec(a), p_b = mpfr_get_prec(b); if(p_a < p_b) p_a = p_b;// p_a := max(p_a, p_b) if(mpfr_get_prec(R) < p_a) mpfr_prec_round(R, p_a, RND);// so prec(R) = max( prec(a), prec(b) ) int ans; mpfr_t s; mpfr_init2(s, p_a); /* "FIXME": check each 'ans' below, and return when not ok ... */ ans = mpfr_add(s, a, b, RND); if(mpfr_integer_p(s) && mpfr_sgn(s) <= 0) { // (a + b) is integer <= 0 if(!mpfr_integer_p(a) && !mpfr_integer_p(b)) { // but a,b not integer ==> R = ln(finite / +-Inf) = ln(0) = -Inf : mpfr_set_inf (R, -1); mpfr_clear (s); return ans; }// else: sum is integer; at least one integer ==> both integer int sX = mpfr_sgn(a), sY = mpfr_sgn(b); if(sX * sY < 0) { // one negative, one positive integer // ==> special treatment here : if(sY < 0) // ==> sX > 0; swap the two mpfr_swap(a, b); /* now have --- a < 0 < b <= |a| integer ------------------ * ================ * --> see my_mpfr_beta() above */ unsigned long b_ = 0;// -Wall Rboolean b_fits_ulong = mpfr_fits_ulong_p(b, RND), small_b = b_fits_ulong && (b_ = mpfr_get_ui(b, RND)) < b_large; if(small_b) { //----------------- small b ------------------ // use GMP big integer arithmetic: mpz_t S; mpz_init(S); mpfr_get_z(S, s, RND); // S := s mpz_sub_ui (S, S, (unsigned long) 1); // S = s - 1 = (a+b-1) /* binomial coefficient choose(N, k) requires k a 'long int'; * here, b must fit into a long: */ mpz_bin_ui (S, S, b_); // S = choose(S, b) = choose(a+b-1, b) mpz_mul_ui (S, S, b_); // S = S*b = b * choose(a+b-1, b) // back to mpfr: R = log(|1 / S|) = - log(|S|) mpz_abs(S, S); mpfr_set_z(s, S, RND); // s := |S| mpfr_log(R, s, RND); // R := log(s) = log(|S|) mpfr_neg(R, R, RND); // R = -R = -log(|S|) mpz_clear(S); } else { // b is "large", use direct B(.,.) formula // a := (-1)^b -- not needed here, neither 'neg': want log( |.| ) // s' := 1-s = 1-a-b mpfr_ui_sub(s, 1, s, RND); // R := log(|B(1-a-b, b)|) = log(|B(s', b)|) my_mpfr_lbeta (R, s, b, RND); } mpfr_clear(s); return ans; } } ans = mpfr_lngamma(s, s, RND); // s = lngamma(a + b) ans = mpfr_lngamma(a, a, RND); ans = mpfr_lngamma(b, b, RND); ans = mpfr_add (b, b, a, RND); // b' = lngamma(a) + lngamma(b) ans = mpfr_sub (R, b, s, RND); mpfr_clear (s); return ans; } /** Binomial Coefficient -- * all initialization and cleanup is called in the caller * @result R = choose(X, n) */ int my_mpfr_choose (mpfr_t R, long n, mpfr_t X, mpfr_rnd_t RND) { int ans; long i; mpfr_t r, x; mpfr_prec_t p_X = mpfr_get_prec(X); mpfr_init2(x, p_X); mpfr_set(x, X, RND); mpfr_init2(r, p_X); if(n > 0) { mpfr_set(r, X, RND); for(i=1; i < n; ) { if(!(i % 100000)) R_CheckUserInterrupt(); // for *large* n mpfr_sub_si(x, x, 1L, RND); // x = X - i mpfr_mul (r, r, x, RND); // r := r * x = X(X-1)..(X-i) mpfr_div_si(r, r, ++i, RND); // r := r / (i+1) = X(X-1)..(X-i) / (1*2..*(i+1)) #ifdef DEBUG_Rmpfr Rprintf("my_mpfr_choose(): X (= X_0 - %d)= ", i); R_PRT(x); Rprintf("\n --> r ="); R_PRT(r); Rprintf("\n"); #endif } } else // n = 0 mpfr_set_si(r, (long) 1, RND); ans = mpfr_set(R, r, RND); mpfr_clear (x); mpfr_clear (r); return ans; } /** Pochhammer Symbol -- *rising* factorial x * (x+1) * ... (x+n-1) * all initialization and cleanup is called in the caller */ int my_mpfr_poch (mpfr_t R, long n, mpfr_t X, mpfr_rnd_t RND) { int ans; long i; mpfr_t r, x; mpfr_prec_t p_X = mpfr_get_prec(X); mpfr_init2(x, p_X); mpfr_set(x, X, RND); mpfr_init2(r, p_X); if(n > 0) { mpfr_set(r, X, RND); for(i=1; i < n; i++) { mpfr_add_si(x, x, 1L, RND); // x = X + i mpfr_mul(r, r, x, RND); // r := r * x = X(X+1)..(X+i) #ifdef DEBUG_Rmpfr Rprintf("my_mpfr_poch(): X (= X_0 + %d)= ", i); R_PRT(x); Rprintf("\n --> r ="); R_PRT(r); Rprintf("\n"); #endif } } else // n = 0 mpfr_set_si(r, (long) 1, RND); ans = mpfr_set(R, r, RND); mpfr_clear (x); mpfr_clear (r); return ans; } /** round to (binary) bits, not (decimal) digits */ int my_mpfr_round (mpfr_t R, long prec, mpfr_t X, mpfr_rnd_t RND) { int ans; if(prec < MPFR_PREC_MIN) error("prec = %d < %d is too small", prec, MPFR_PREC_MIN); if(prec > MPFR_PREC_MAX) error("prec = %d > %d is too large", prec, MPFR_PREC_MAX); mpfr_set(R, X, RND); ans = mpfr_prec_round(R, (mpfr_prec_t) prec, RND); return ans; } /*------------------------------------------------------------------------*/ SEXP R_mpfr_get_version(void) { return mkString(mpfr_get_version()); } SEXP R_mpfr_get_GMP_numb_bits(void) {// for diagnosing return ScalarInteger((int)GMP_NUMB_BITS); } /* Set or get the C-global debugging level -- * currently only used in R_mpfr_dbg_printf() --> ./Rmpfr_utils.h * * Called from R .mpfr_debug(i = NA) */ SEXP R_mpfr_set_debug(SEXP I) { if(LENGTH(I) < 1 || INTEGER(I)[0] == NA_INTEGER) return ScalarInteger(R_mpfr_debug_); /* else : */ int prev = R_mpfr_debug_; R_mpfr_debug_ = asInteger(I); return ScalarInteger(prev); } SEXP R_mpfr_get_default_prec(void) { return ScalarInteger((int) mpfr_get_default_prec()); } SEXP R_mpfr_set_default_prec(SEXP prec) { // return the previous value int prev = (int) mpfr_get_default_prec(); mpfr_set_default_prec((mpfr_prec_t) asInteger(prec)); return ScalarInteger(prev); } // is MPFR's exponent range 'erange' representable as R's (32 bit) integer [INT_MIN not allowed] : int mpfr_erange_int_p(void) { mpfr_exp_t r = mpfr_get_emin(); int i_ok = (INT_MIN < r && r <= INT_MAX); if(i_ok) { r = mpfr_get_emax(); i_ok = (INT_MIN < r && r <= INT_MAX); } return i_ok; } /** R's .mpfr_erange_is_int() - workhorse */ SEXP R_mpfr_erange_int_p(void) { return ScalarLogical(mpfr_erange_int_p()); } /* MUST be sync'ed with ../R/mpfr.R * ~~~~~~~~~~~ and its .mpfr_erange_kinds */ typedef enum { E_min = 1, E_max, min_emin, max_emin, min_emax, max_emax } erange_kind; // Called from R's .mpfr.erange(), now allows 'kind' to be a vector SEXP R_mpfr_get_erange(SEXP kind_) { int k = LENGTH(kind_), nprot = 0; erange_kind *kind; if(TYPEOF(kind_) != INTSXP) { SEXP kk = PROTECT(coerceVector(kind_, INTSXP)); nprot++; kind = (erange_kind *) INTEGER(kk); } else { kind = (erange_kind *) INTEGER(kind_); } mpfr_exp_t *r = (mpfr_exp_t *) R_alloc(k, sizeof(mpfr_exp_t)); Rboolean int_ok = TRUE; for(int j = 0; j < k; j++) { switch(kind[j]) { // keep the 'case' list in sync with 'erange_kind' enum above: case E_min: r[j] = mpfr_get_emin(); if(int_ok && (r[j] <= INT_MIN || r[j] > INT_MAX)) int_ok=FALSE; break; case E_max: r[j] = mpfr_get_emax(); if(int_ok && (r[j] <= INT_MIN || r[j] > INT_MAX)) int_ok=FALSE; break; case min_emin: r[j] = mpfr_get_emin_min(); if(int_ok) int_ok=FALSE; break; case max_emin: r[j] = mpfr_get_emin_max(); if(int_ok) int_ok=FALSE; break; case min_emax: r[j] = mpfr_get_emax_min(); if(int_ok) int_ok=FALSE; break; case max_emax: r[j] = mpfr_get_emax_max(); if(int_ok) int_ok=FALSE; break; default: error("invalid kind[j(=%d)] (code = %d) in R_mpfr_get_erange()", j, kind); } R_mpfr_dbg_printf(1,"R_mpfr_get_erange(%d): %ld\n", kind[j], (long)r[j]); } SEXP ans; // int_ok: only now know if we can return integer or need double if(int_ok) { int* R = INTEGER(ans = allocVector(INTSXP, k)); for(int j = 0; j < k; j++) R[j] = (int) r[j]; } else { double* R = REAL(ans = allocVector(REALSXP, k)); for(int j = 0; j < k; j++) R[j] = (double) r[j]; } if(nprot) UNPROTECT(nprot); return ans; } // R's .mpfr_erange_set() -- here, set *one* of Emin and Emax: SEXP R_mpfr_set_erange(SEXP kind_, SEXP val) { erange_kind kind = asInteger(kind_); mpfr_exp_t exp_val; if(isInteger(val)) exp_val = asInteger(val);// assume this is always valid to set else { // we allow larger values from the R side PROTECT(val = coerceVector(val, REALSXP)); exp_val = (mpfr_exp_t) asReal(val); UNPROTECT(1); } int i_err; switch(kind) { case E_min: i_err = mpfr_set_emin(exp_val); break; case E_max: i_err = mpfr_set_emax(exp_val); break; default: error("invalid kind (code = %d) in R_mpfr_set_erange()", kind); } if(i_err) warning("e%s exponent could not be set to %ld (code %d)", (kind == E_min) ? "min" : "max", (long)exp_val, i_err); return ScalarInteger(i_err); } SEXP R_mpfr_prec_range(SEXP ind) { long r = (long) ( (INTEGER(ind)[0] == 1) ? MPFR_PREC_MIN : MPFR_PREC_MAX); R_mpfr_dbg_printf(1,"R_mpfr_prec_range(): %ld\n", r); // in 64 bit, int << long, so go "2nd best": return ScalarReal((double)r); } /** Get the 'base 2 exp slot' -- also in extended erange where it does not fit into integer * Directly called from R's .mpfr2exp(x) */ SEXP R_mpfr_2exp(SEXP x) { int n = length(x); mpfr_t R_i; mpfr_init(R_i); SEXP val; if(mpfr_erange_int_p()) { // integer is ok: 'exp' values won't be too large val = PROTECT(allocVector(INTSXP,n)); int *exp = INTEGER(val); for(int i=0; i < n; i++) { R_asMPFR(VECTOR_ELT(x, i), R_i); exp[i] = (int) mpfr_get_exp(R_i); } } else { val = PROTECT(allocVector(REALSXP,n)); double *exp = REAL(val); for(int i=0; i < n; i++) { R_asMPFR(VECTOR_ELT(x, i), R_i); exp[i] = (double) mpfr_get_exp(R_i); } } mpfr_clear(R_i); mpfr_free_cache(); UNPROTECT(1); return val; } //---------------------------------------------------------------------------- #define INIT_1_SETUP(_X_, _R_) \ mpfr_t _R_; \ \ mpfr_init2(_R_, R_mpfr_prec(_X_)); \ R_asMPFR(_X_, _R_) #define FINISH_1_RETURN(_R_, val) \ val = PROTECT(MPFR_as_R(_R_)); \ mpfr_clear (_R_); \ mpfr_free_cache(); \ UNPROTECT(1); \ return val SEXP const_asMpfr(SEXP I, SEXP prec, SEXP rnd_mode) { SEXP val; mpfr_t r; int i_p = asInteger(prec); R_mpfr_check_prec(i_p); mpfr_init2(r, i_p); switch(asInteger(I)) { case 1: mpfr_const_pi (r, R_rnd2MP(rnd_mode)); break; case 2: mpfr_const_euler (r, R_rnd2MP(rnd_mode)); break; case 3: mpfr_const_catalan(r, R_rnd2MP(rnd_mode)); break; case 4: mpfr_const_log2 (r, R_rnd2MP(rnd_mode)); break; default: error("invalid integer code {const_asMpfr()}"); /* -Wall */ } FINISH_1_RETURN(r, val); } /** For functions <- FUN(x = ) : */ #define R_MPFR_Logic_Function(_FNAME, _MPFR_NAME) \ SEXP _FNAME(SEXP x) { \ SEXP D = PROTECT(GET_SLOT(x, Rmpfr_Data_Sym));/* R list() */ \ int n = length(D), i; \ SEXP val = PROTECT(allocVector(LGLSXP, n)); \ int *r = LOGICAL(val); \ mpfr_t r_i; \ mpfr_init(r_i); \ \ for(i=0; i < n; i++) { \ R_asMPFR(VECTOR_ELT(D, i), r_i); \ r[i] = _MPFR_NAME (r_i); \ } \ \ mpfr_clear (r_i); \ mpfr_free_cache(); \ UNPROTECT(2); \ return val; \ } R_MPFR_Logic_Function(R_mpfr_is_finite, mpfr_number_p) R_MPFR_Logic_Function(R_mpfr_is_infinite, mpfr_inf_p) R_MPFR_Logic_Function(R_mpfr_is_integer, mpfr_integer_p) R_MPFR_Logic_Function(R_mpfr_is_na, mpfr_nan_p) R_MPFR_Logic_Function(R_mpfr_is_zero, mpfr_zero_p) #define R_MPFRarray_Logic_Function(_FNAME, _MPFR_NAME) \ SEXP _FNAME(SEXP x) { \ SEXP D = PROTECT(GET_SLOT(x, Rmpfr_Data_Sym)),/* R list() */ \ dim = PROTECT(GET_SLOT(x, Rmpfr_Dim_Sym)), \ dn = PROTECT(GET_SLOT(x, Rmpfr_Dimnames_Sym)); \ int n = length(D), i; \ SEXP val = PROTECT(allocVector(LGLSXP, n)); \ int *r = LOGICAL(val); \ mpfr_t r_i; \ mpfr_init(r_i); \ \ for(i=0; i < n; i++) { \ R_asMPFR(VECTOR_ELT(D, i), r_i); \ r[i] = _MPFR_NAME (r_i); \ } \ \ mpfr_clear (r_i); \ mpfr_free_cache(); \ setAttrib(val, R_DimSymbol, duplicate(dim)); \ setAttrib(val, R_DimNamesSymbol, duplicate(dn)); \ UNPROTECT(4); \ return val; \ } R_MPFRarray_Logic_Function(R_mpfr_is_finite_A, mpfr_number_p) R_MPFRarray_Logic_Function(R_mpfr_is_infinite_A, mpfr_inf_p) R_MPFRarray_Logic_Function(R_mpfr_is_integer_A, mpfr_integer_p) R_MPFRarray_Logic_Function(R_mpfr_is_na_A, mpfr_nan_p) R_MPFRarray_Logic_Function(R_mpfr_is_zero_A, mpfr_zero_p) SEXP R_mpfr_fac (SEXP n_, SEXP prec, SEXP rnd_mode) { int n = length(n_), i, *nn; SEXP n_t, val = PROTECT(allocVector(VECSXP, n)); int nprot = 1; mpfr_rnd_t rnd = R_rnd2MP(rnd_mode); mpfr_t r_i; if(TYPEOF(n_) != INTSXP) { PROTECT(n_t = coerceVector(n_, INTSXP)); nprot++;/* or bail out*/ nn = INTEGER(n_t); } else { nn = INTEGER(n_); } int i_p = asInteger(prec); R_mpfr_check_prec(i_p); mpfr_init2(r_i, i_p); for(i=0; i < n; i++) { // never happens when called from R: if(nn[i] < 0) error("R_mpfr_fac(%d): negative n.", nn[i]); mpfr_fac_ui(r_i, nn[i], rnd); SET_VECTOR_ELT(val, i, MPFR_as_R(r_i)); } mpfr_clear(r_i); mpfr_free_cache(); UNPROTECT(nprot); return val; } /** For functions FUN(x = , y = ) : */ #define R_MPFR_2_Numeric_Function(_FNAME, _MPFR_NAME) \ SEXP _FNAME(SEXP x, SEXP y, SEXP rnd_mode) { \ SEXP xD = PROTECT(GET_SLOT(x, Rmpfr_Data_Sym)); \ SEXP yD = PROTECT(GET_SLOT(y, Rmpfr_Data_Sym)); \ mpfr_rnd_t rnd = R_rnd2MP(rnd_mode); \ int nx = length(xD), ny = length(yD), i, \ n = (nx == 0 || ny == 0) ? 0 : imax2(nx, ny); \ SEXP val = PROTECT(allocVector(VECSXP, n)); \ mpfr_t R, x_i, y_i; \ mpfr_init(R); /* with default precision */ \ mpfr_init(x_i); mpfr_init(y_i); \ \ for(i=0; i < n; i++) { \ R_asMPFR(VECTOR_ELT(xD, i % nx), x_i); \ R_asMPFR(VECTOR_ELT(yD, i % ny), y_i); \ _MPFR_NAME(R, x_i, y_i, rnd); \ SET_VECTOR_ELT(val, i, MPFR_as_R(R)); \ } \ \ mpfr_clear(R); mpfr_clear(x_i); mpfr_clear(y_i); \ mpfr_free_cache(); \ UNPROTECT(3); \ return val; \ } R_MPFR_2_Numeric_Function(R_mpfr_atan2, mpfr_atan2) R_MPFR_2_Numeric_Function(R_mpfr_hypot, mpfr_hypot) #if (MPFR_VERSION >= MPFR_VERSION_NUM(3,2,0)) R_MPFR_2_Numeric_Function(R_mpfr_igamma, mpfr_gamma_inc) #else SEXP R_mpfr_igamma(SEXP x, SEXP y, SEXP rnd_mode) { error("mpfr_gamma_inc requires mpfr >= 3.2.0"); return R_NilValue; } #endif R_MPFR_2_Numeric_Function(R_mpfr_beta, my_mpfr_beta) R_MPFR_2_Numeric_Function(R_mpfr_lbeta, my_mpfr_lbeta) /** For functions FUN(x = , y = ) : */ #define R_MPFR_2_Num_Long_Function(_FNAME, _MPFR_NAME) \ SEXP _FNAME(SEXP x, SEXP y, SEXP rnd_mode) { \ SEXP xD, yt, val; \ mpfr_rnd_t rnd = R_rnd2MP(rnd_mode); \ int *yy, n, nx, ny = length(y), i, nprot = 0; \ mpfr_t x_i; \ \ if(TYPEOF(y) != INTSXP) { \ PROTECT(yt = coerceVector(y, INTSXP)); nprot++;/* or bail out*/ \ yy = INTEGER(yt); \ } else { \ yy = INTEGER(y); \ } \ PROTECT(xD = GET_SLOT(x, Rmpfr_Data_Sym)); nprot++; \ nx = length(xD); \ n = (nx == 0 || ny == 0) ? 0 : imax2(nx, ny); \ PROTECT(val = allocVector(VECSXP, n)); nprot++; \ mpfr_init(x_i); /* with default precision */ \ \ for(i=0; i < n; i++) { \ R_asMPFR(VECTOR_ELT(xD, i % nx), x_i); \ _MPFR_NAME(x_i, (long) yy[i % ny], x_i, rnd); \ SET_VECTOR_ELT(val, i, MPFR_as_R(x_i)); \ } \ \ mpfr_clear (x_i); \ mpfr_free_cache(); \ UNPROTECT(nprot); \ return val; \ } R_MPFR_2_Num_Long_Function(R_mpfr_jn, mpfr_jn) R_MPFR_2_Num_Long_Function(R_mpfr_yn, mpfr_yn) R_MPFR_2_Num_Long_Function(R_mpfr_choose, my_mpfr_choose) R_MPFR_2_Num_Long_Function(R_mpfr_poch, my_mpfr_poch) R_MPFR_2_Num_Long_Function(R_mpfr_round, my_mpfr_round) Rmpfr/src/Rmpfr_utils.h0000644000175000017500000001401514107223103014732 0ustar nileshnilesh#ifndef R_MPFR_MUTILS_H #define R_MPFR_MUTILS_H /* #ifdef __cplusplus */ /* extern "C" { */ /* #endif */ #include #include /* for va_list ..*/ #include /* includes Rconfig.h */ #include #include // previously from : #ifndef GET_SLOT # define GET_SLOT(x, what) R_do_slot(x, what) # define SET_SLOT(x, what, value) R_do_slot_assign(x, what, value) # define MAKE_CLASS(what) R_do_MAKE_CLASS(what) # define NEW_OBJECT(class_def) R_do_new_object(class_def) #endif #include /* must come *after* the above, e.g., for mpfr_out_str() (which needs stdio): */ #include #include #ifdef ENABLE_NLS #include #define _(String) dgettext ("Rmpfr", String) #else #define _(String) (String) #endif #if (MPFR_VERSION < MPFR_VERSION_NUM(3,0,0)) /* define back-compatibility types:*/ # define MPFR_RNDD GMP_RNDD # define MPFR_RNDN GMP_RNDN # define MPFR_RNDU GMP_RNDU # define MPFR_RNDZ GMP_RNDZ // # define MPFR_RNDA GMP_RNDA # define mpfr_exp_t mp_exp_t #endif /*----------------------------------------*/ #ifdef _in_Rmpfr_init_ /* global */ int R_mpfr_debug_ = 0; #else extern int R_mpfr_debug_; #endif /* A version of Rprintf() .. but only printing when R_mpfr_debug_ is large enough :*/ static R_INLINE void R_mpfr_dbg_printf(int dbg_level, const char *format, ...) { if(R_mpfr_debug_ && R_mpfr_debug_ >= dbg_level) { va_list(ap); Rprintf(".mpfr_debug[%d]: ", R_mpfr_debug_); va_start(ap, format); REvprintf(format, ap); va_end(ap); } } static R_INLINE void R_mpfr_dbg_printf_0(int dbg_level, const char *format, ...) { if(R_mpfr_debug_ && R_mpfr_debug_ >= dbg_level) { va_list(ap); va_start(ap, format); REvprintf(format, ap); va_end(ap); } } /* This is from Matrix/src/Mutils.h : */ static R_INLINE SEXP ALLOC_SLOT(SEXP obj, SEXP nm, SEXPTYPE type, int length) { SEXP val = allocVector(type, length); SET_SLOT(obj, nm, val); return val; } #define N_LIMBS(_PREC_) ceil(((double)_PREC_)/mp_bits_per_limb) static R_INLINE int R_mpfr_nr_limbs(mpfr_t r) { return N_LIMBS(mpfr_get_prec(r)); } // Note: "in theory" we could set precBits > INT_MAX, but currently not in Rmpfr: static R_INLINE void R_mpfr_check_prec(int prec) { if(prec == NA_INTEGER) error("Precision(bit) is NA (probably from coercion)"); if(prec < MPFR_PREC_MIN) error("Precision(bit) = %d < %ld (= MPFR_PREC_MIN)", prec, (long)MPFR_PREC_MIN); /* 2018-01-01 gives a WARNING with clang: Found the following significant warnings: ./Rmpfr_utils.h:89:13: warning: comparison of constant 9223372036854775807 with expression of type 'int' is always false [-Wtautological-constant-out-of-range-compare] ... of course, I don't want a WARN in the CRAN checks, hence disable (for now): if(prec > MPFR_PREC_MAX) error("Precision(bit) = %d > %ld (= MPFR_PREC_MAX)", prec, (long)MPFR_PREC_MAX); */ return; } #define R_mpfr_prec(x) INTEGER(GET_SLOT(x, Rmpfr_precSym))[0] #define MISMATCH_WARN \ if (mismatch) \ warning(_("longer object length is not a multiple of shorter object length")) #define SET_MISMATCH \ if (nx == ny || nx == 1 || ny == 1) mismatch = 0; \ else if (nx > 0 && ny > 0) { \ if (nx > ny) mismatch = nx % ny; \ else mismatch = ny % nx; \ } /* ./convert.c : */ mpfr_rnd_t R_rnd2MP(SEXP rnd_mode); SEXP d2mpfr1 (SEXP x, SEXP prec, SEXP rnd_mode); SEXP d2mpfr1_(double x, int i_prec, mpfr_rnd_t rnd); SEXP d2mpfr1_list(SEXP x, SEXP prec, SEXP rnd_mode); SEXP mpfr2d(SEXP x, SEXP rnd_mode); SEXP mpfr2i(SEXP x, SEXP rnd_mode); SEXP mpfr2str(SEXP x, SEXP digits, SEXP maybe_full, SEXP base); SEXP str2mpfr1_list(SEXP x, SEXP prec, SEXP base, SEXP rnd_mode); SEXP R_mpfr_formatinfo(SEXP x); #ifdef R_had_R_Outputfile_in_API # ifndef WIN32 SEXP print_mpfr (SEXP x, SEXP digits); SEXP print_mpfr1(SEXP x, SEXP digits); # endif #endif SEXP Rmpfr_minus(SEXP x); SEXP Rmpfr_abs(SEXP x); SEXP Math_mpfr(SEXP x, SEXP op); SEXP Arith_mpfr(SEXP x, SEXP y, SEXP op); SEXP Arith_mpfr_i(SEXP x, SEXP y, SEXP op); SEXP Arith_i_mpfr(SEXP x, SEXP y, SEXP op); SEXP Arith_mpfr_d(SEXP x, SEXP y, SEXP op); SEXP Arith_d_mpfr(SEXP x, SEXP y, SEXP op); SEXP Compare_mpfr(SEXP x, SEXP y, SEXP op); SEXP Compare_mpfr_i(SEXP x, SEXP y, SEXP op); SEXP Compare_mpfr_d(SEXP x, SEXP y, SEXP op); SEXP Summary_mpfr(SEXP x, SEXP na_rm, SEXP op); SEXP R_mpfr_sumprod(SEXP x, SEXP y, SEXP minPrec, SEXP alternating); #ifdef __NOT_ANY_MORE__ /* deprecated: */ SEXP exp_mpfr1(SEXP x); SEXP log_mpfr1(SEXP x); #endif void R_asMPFR(SEXP x, mpfr_ptr r); SEXP MPFR_as_R(mpfr_t r); /* ./utils.c */ SEXP R_mpfr_set_debug(SEXP I); SEXP R_mpfr_set_default_prec(SEXP prec); SEXP R_mpfr_get_default_prec(void); int mpfr_erange_int_p(void); SEXP R_mpfr_erange_int_p(void); SEXP R_mpfr_get_erange(SEXP kind); SEXP R_mpfr_set_erange(SEXP kind, SEXP val); SEXP R_mpfr_prec_range(SEXP ind); SEXP R_mpfr_get_version(void); SEXP R_mpfr_get_GMP_numb_bits(void); SEXP R_mpfr_2exp(SEXP x); SEXP R_mpfr_ldexp(SEXP f, SEXP E, SEXP rnd_mode); SEXP R_mpfr_frexp(SEXP x, SEXP rnd_mode); SEXP const_asMpfr(SEXP I, SEXP prec, SEXP rnd_mode); SEXP R_mpfr_is_finite(SEXP x); SEXP R_mpfr_is_finite_A(SEXP x); SEXP R_mpfr_is_infinite(SEXP x);SEXP R_mpfr_is_infinite_A(SEXP x); SEXP R_mpfr_is_integer(SEXP x); SEXP R_mpfr_is_integer_A(SEXP x); SEXP R_mpfr_is_na(SEXP x); SEXP R_mpfr_is_na_A(SEXP x); SEXP R_mpfr_is_zero(SEXP x); SEXP R_mpfr_is_zero_A(SEXP x); SEXP R_mpfr_atan2(SEXP x, SEXP y, SEXP rnd_mode); SEXP R_mpfr_hypot(SEXP x, SEXP y, SEXP rnd_mode); SEXP R_mpfr_beta (SEXP x, SEXP y, SEXP rnd_mode); SEXP R_mpfr_lbeta(SEXP x, SEXP y, SEXP rnd_mode); SEXP R_mpfr_igamma(SEXP a, SEXP x, SEXP rnd_mode); SEXP R_mpfr_jn(SEXP x, SEXP n, SEXP rnd_mode); SEXP R_mpfr_yn(SEXP x, SEXP n, SEXP rnd_mode); SEXP R_mpfr_fac (SEXP n, SEXP prec, SEXP rnd_mode); SEXP R_mpfr_choose(SEXP a, SEXP n, SEXP rnd_mode); SEXP R_mpfr_poch (SEXP a, SEXP n, SEXP rnd_mode); SEXP R_mpfr_round (SEXP x, SEXP prec, SEXP rnd_mode); /* #ifdef __cplusplus */ /* } */ /* #endif */ #endif /* R_MPFR_MUTILS_H_ */ Rmpfr/src/Makevars.in0000644000175000017500000000140213565172775014401 0ustar nileshnilesh# -*- Makefile -*- # Link with GMP (GNU Multiple Precision) # and with MPFR (Multiple Precision Floating point Reliable) Libraries # was # PKG_LIBS = -lmpfr -lgmp # # To find things in non-default location, when the user uses something like # R CMD INSTALL --configure-args="--with-mpfr-lib=/*/mpfr-3.1.5/lib --with-mpfr-include=/*/mpfr-3.1.5/include" # then CPPFLAGS and PKG_LDFLAGS should be set from ../configure # PKG_CPPFLAGS=$(CPPFLAGS) #-- "Regularly" -- PKG_CFLAGS=$(CFLAGS) PKG_LIBS=$(PKG_LDFLAGS) -lmpfr -lgmp #--MM-- "Works to get newest" (for me via PKG_CONFIG_PATH & sym.link in /usr/local.nfs/app/pkgconfig) # PKG_CFLAGS = `pkg-config --cflags mpfr` # PKG_LIBS = `pkg-config --libs mpfr` # PKG_LDFLAGS = `pkg-config --libs-only-L mpfr` $(LDFLAGS) Rmpfr/src/Summary.c0000644000175000017500000001763113640371676014107 0ustar nileshnilesh/* * MPFR - Multiple Precision Floating-Point Reliable Library * ---- - - - - * * Arithmetic, Math, etc */ #include #include /* imax2() */ #include "Rmpfr_utils.h" extern #include "Syms.h" /*------------------------------------------------------------------------*/ SEXP Summary_mpfr(SEXP x, SEXP na_rm, SEXP op) { enum { MAX = 1, MIN, RANGE, PROD, SUM, ANY = 10, ALL } i_op = asInteger(op); /* MUST be sync'ed with ../R/Summary.R * ~~~~~~~~~~~~~~ where .Summary.codes <- * c("max" = 1, "min" = 2, "range" = 3, "prod" = 4, "sum" = 5, * "any" = 10, "all" = 11) */ mpfr_prec_t current_prec = mpfr_get_default_prec(); int n = length(x), return_list = (i_op < ANY), remove_na = asLogical(na_rm), n_valid = 0, i; SEXP val = R_NilValue; int *ans = NULL; /*"Wall", will be := LOGICAL(val) for any() / all() only */ mpfr_t R_i, Summ, Sum2; /* for range(), max(), min(), sum(), prod() */ mpfr_init(R_i); /* with default precision */ if (return_list) mpfr_init(Summ); #define Rmpfr_set(_N_) val = PROTECT(allocVector(VECSXP, _N_)); break switch(i_op) { case MAX: mpfr_set_inf(Summ, -1);/* := -Inf */; Rmpfr_set(1); case MIN: mpfr_set_inf(Summ, +1);/* := +Inf */; Rmpfr_set(1); case RANGE: mpfr_init(Sum2); mpfr_set_inf(Summ, +1);/* := +Inf for min() */ mpfr_set_inf(Sum2, -1);/* := -Inf for max() */ Rmpfr_set(2); case PROD: mpfr_set_d (Summ, 1., MPFR_RNDZ); Rmpfr_set(1); case SUM: mpfr_set_d (Summ, 0., MPFR_RNDZ); Rmpfr_set(1); case ANY: val = ScalarLogical(FALSE); break; case ALL: val = ScalarLogical(TRUE); break; default: error("invalid op code (%d) in Summary_mpfr", i_op); } if (!return_list) /* will return logical */ ans = LOGICAL(val); for(i=0; i < n; i++) { SEXP xi = VECTOR_ELT(x, i); R_asMPFR(xi, R_i); if(mpfr_nan_p(R_i)) { /* handling does not depend on i_op */ /* REprintf("Summary_mpfr(), i=%d : R_i is NaN\n", i); */ if(remove_na) /* skip this NA / NAN entry: */ continue; else { /* result is NA */ /* should not be needed: R_i *is* NaN already : mpfr_set_nan(R_i); */ switch(i_op) { case MAX: case MIN: case PROD: case SUM: SET_VECTOR_ELT(val, 0, xi); break; case RANGE: SET_VECTOR_ELT(val, 0, xi); SET_VECTOR_ELT(val, 1, xi); break; /*---------------------------------------------*/ case ANY: if(*ans == FALSE) *ans = NA_LOGICAL; break; case ALL: if(*ans == TRUE) *ans = NA_LOGICAL; break; } } if(return_list) { /* return() *unless* for any()/all() : */ mpfr_free_cache(); UNPROTECT(1); return val; } } else n_valid++; if(return_list) { /* hence using Summ */ mpfr_prec_t i_prec = mpfr_get_prec(R_i); if(current_prec < i_prec) /* increase precision */ { current_prec = i_prec; mpfr_prec_round(Summ, i_prec, MPFR_RNDN); if(i_op == RANGE) mpfr_prec_round(Sum2, i_prec, MPFR_RNDN); } } switch(i_op) { /* Note we assign use R_i as "input and output" ==> *same* precision, even though in some cases the result may need higher precision */ case MAX: mpfr_max(Summ, Summ, R_i, MPFR_RNDN); break; case MIN: mpfr_min(Summ, Summ, R_i, MPFR_RNDN); break; case RANGE: mpfr_min(Summ, Summ, R_i, MPFR_RNDN); mpfr_max(Sum2, Sum2, R_i, MPFR_RNDN); break; case PROD: mpfr_mul(Summ, Summ, R_i, MPFR_RNDN); break; case SUM: mpfr_add(Summ, Summ, R_i, MPFR_RNDN); break; case ANY: if(!mpfr_zero_p(R_i)) *ans = TRUE; break; case ALL: if( mpfr_zero_p(R_i)) *ans = FALSE; break; } } /* for(i .. n) */ mpfr_clear (R_i); switch(i_op) { case MAX: case MIN: case PROD: case SUM: SET_VECTOR_ELT(val, 0, MPFR_as_R(Summ)); mpfr_clear (Summ); break; case RANGE: SET_VECTOR_ELT(val, 0, MPFR_as_R(Summ)); SET_VECTOR_ELT(val, 1, MPFR_as_R(Sum2)); mpfr_clear (Summ); mpfr_clear (Sum2); break; case ANY: case ALL: /* nothing to be done */ break; } mpfr_free_cache(); if(return_list) UNPROTECT(1); return val; } /* Summary_mpfr() */ /** Compute sum(x * y) == x %*% y for two [mpfr-]vectors of the same length Both x and y can be in {mpfr, double, integer} ! */ SEXP R_mpfr_sumprod(SEXP x, SEXP y, SEXP minPrec, SEXP alternating_) { int n = length(x); if(length(y) != n) error("%d == length(x) != length(y) == %d", n, length(y)); int i_min_prec = asInteger(minPrec), nprot = 1; Rboolean alternating = asLogical(alternating_); // Simplification (FIXME: more efficient -> use 6 cases; s/ M_n / M_d and M_i /) if(isInteger(x)) { PROTECT(x = coerceVector(x, REALSXP)); nprot++; } if(isInteger(y)) { PROTECT(y = coerceVector(y, REALSXP)); nprot++; } if(isReal(x) && isReal(y)) error("R_mpfr_sumprod(x,y, .): either x or y must be \"mpfr\", but both are numeric"); // --> three cases: // M_M: both mpfr, // n_M: x numeric, y mpfr // M_n: x mpfr , y numeric enum { M_M, n_M, M_n } R_case = isReal(x) ? n_M : isReal(y) ? M_n : M_M; Rboolean use_r = alternating && R_case == M_M; mpfr_t Summ, x_i, y_i, r; mpfr_inits(Summ, x_i, y_i, (mpfr_ptr) 0); /* with default precision */ mpfr_set_d(Summ, 0., MPFR_RNDZ); double *xx = NULL, *yy = NULL; if(R_case == n_M) xx = REAL(x); else if(R_case == M_n) yy = REAL(y); mpfr_prec_t min_prec = MPFR_PREC_MIN, xy_prec, S_prec = mpfr_get_prec(Summ); if(i_min_prec != NA_INTEGER && min_prec < i_min_prec) min_prec = (mpfr_prec_t) i_min_prec; if(S_prec < min_prec) { mpfr_prec_round (Summ, min_prec, MPFR_RNDN); S_prec = min_prec; } if(use_r) mpfr_init2(r, S_prec); for(int i=0; i < n; i++) { double xi = 0., yi = 0.; // Wall #define IF_NA_set_and_continue(_NA_COND_) \ if(_NA_COND_) { \ mpfr_set_nan(Summ); \ continue;/* -> "next i" */ \ } switch(R_case) { case M_M : R_asMPFR(VECTOR_ELT(x, i), x_i); R_asMPFR(VECTOR_ELT(y, i), y_i); IF_NA_set_and_continue(mpfr_nan_p(x_i) || mpfr_nan_p(y_i)); xy_prec = imax2(mpfr_get_prec(x_i), mpfr_get_prec(y_i)); break; case M_n : R_asMPFR(VECTOR_ELT(x, i), x_i); yi = yy[i]; IF_NA_set_and_continue(mpfr_nan_p(x_i) || ISNA(yi)); xy_prec = imax2(mpfr_get_prec(x_i), 53); break; case n_M : xi = xx[i]; R_asMPFR(VECTOR_ELT(y, i), y_i); IF_NA_set_and_continue(ISNA(xi) || mpfr_nan_p(y_i)); xy_prec = imax2(53, mpfr_get_prec(y_i)); break; } // switch() if(S_prec < xy_prec) {/* increase it, since it will store the result */ mpfr_prec_round (Summ, xy_prec, MPFR_RNDN); S_prec = xy_prec; if(use_r) mpfr_set_prec(r, S_prec); } if(alternating && (i % 2)) { // Summ := Summ - (x_i * y_i) switch(R_case) { case M_M : /* mpfr_fms (ROP, OP1, OP2, OP3, RND) * Set ROP to (OP1 times OP2) - OP3 rounded in the direction RND. */ mpfr_fms (r, x_i, y_i, Summ, MPFR_RNDN); // r = x_i * y_i - Summ mpfr_neg (Summ, r, MPFR_RNDN); break; case M_n : mpfr_mul_d(x_i, x_i, yi, MPFR_RNDN); mpfr_sub(Summ, Summ, x_i,MPFR_RNDN); break; case n_M : mpfr_mul_d(y_i, y_i, xi, MPFR_RNDN); mpfr_sub(Summ, Summ, y_i,MPFR_RNDN); break; } } else { // Summ := Summ + (x_i * y_i) switch(R_case) { case M_M : /* mpfr_fma (ROP, OP1, OP2, OP3, RND) * Set ROP to (OP1 times OP2) + OP3 rounded in the direction RND. */ mpfr_fma (Summ, x_i, y_i, Summ, MPFR_RNDN); break; case M_n : mpfr_mul_d(x_i, x_i, yi, MPFR_RNDN); mpfr_add(Summ, Summ, x_i,MPFR_RNDN); break; case n_M : mpfr_mul_d(y_i, y_i, xi, MPFR_RNDN); mpfr_add(Summ, Summ, y_i,MPFR_RNDN); break; } } } // for( i ) // val <- list( Summ ) : SEXP val = PROTECT(allocVector(VECSXP, 1)); SET_VECTOR_ELT(val, 0, MPFR_as_R(Summ)); mpfr_clears(Summ, x_i, y_i, (mpfr_ptr) 0); if(use_r) mpfr_clear(r); mpfr_free_cache(); UNPROTECT(nprot); return val; } // R_mpfr_sumprod Rmpfr/src/convert.c0000644000175000017500000006234114135104473014115 0ustar nileshnilesh/* * MPFR - Multiple Precision Floating-Point Reliable Library * ---- - - - - */ #include /* for imax2() */ #include "Rmpfr_utils.h" extern #include "Syms.h" /*------------------------------------------------------------------------*/ /* NB: int nr_limbs = R_mpfr_nr_limbs(r) [ in MPFR_as_R() ] or * = N_LIMBS(i_prec) [ in d2mpfr1_() ] * R_mpfr_exp_size is sufficient also for enlarged exponent range, as that is still < 2^62 */ #if GMP_NUMB_BITS == 32 # define R_mpfr_nr_ints nr_limbs # define R_mpfr_exp_size 1 #elif GMP_NUMB_BITS == 64 # define R_mpfr_nr_ints (2*nr_limbs) # define R_mpfr_exp_size 2 #else # error "R <-> C Interface *not* implemented for GMP_NUMB_BITS=" ## GMP_NUMB_BITS #endif // Initialize contents (4 slots) of a "mpfr1" R object #define R_mpfr_MPFR_2R_init(_V_, _d_length_) \ SEXP _V_ = PROTECT(NEW_OBJECT(PROTECT(MAKE_CLASS("mpfr1")))); \ SEXP prec_R = PROTECT(ALLOC_SLOT(_V_, Rmpfr_precSym, INTSXP, 1)); \ SEXP sign_R = PROTECT(ALLOC_SLOT(_V_, Rmpfr_signSym, INTSXP, 1)); \ SEXP exp_R = PROTECT(ALLOC_SLOT(_V_, Rmpfr_expSym, INTSXP, R_mpfr_exp_size)); \ SEXP d_R = PROTECT(ALLOC_SLOT(_V_, Rmpfr_d_Sym, INTSXP, _d_length_)); \ /* the integer vector which makes up the mantissa: */ \ int *dd = INTEGER(d_R), \ *ex = INTEGER(exp_R) /* the one for the exponent */ /*------------------------*/ #if GMP_NUMB_BITS == 32 /* ---- easy : a gmp-limb is an int <--> R */ // This is only ok if( mpfr_regular_p(.) ), i.e. not for {0, NaN, Inf}: # define R_mpfr_FILL_DVEC(i) \ R_mpfr_dbg_printf(2,"r..d[i=%d] = 0x%lx\n",i,r->_mpfr_d[i]); \ dd[i] = (int) r->_mpfr_d[i] # define R_mpfr_GET_DVEC(i) \ r->_mpfr_d[i] = (mp_limb_t) dd[i]; \ R_mpfr_dbg_printf(2,"dd[%d] = %10lu -> r..d[i=%d]= 0x%lx\n", \ i, dd[i], i,r->_mpfr_d[i]) # define R_mpfr_FILL_EXP ex[0] = (int)r->_mpfr_exp # define R_mpfr_GET_EXP r->_mpfr_exp = (mpfr_exp_t) ex[0] /*------------------------*/ #elif GMP_NUMB_BITS == 64 /* ---- here a gmp-limb is 64-bit (long long): * ==> one limb <---> 2 R int.s : */ # define RIGHT_HALF(_LONG_) ((long long)(_LONG_) & 0x00000000FFFFFFFF) // 1 4 8| 4 8 # define LEFT_SHIFT(_LONG_) (((unsigned long long)(_LONG_)) << 32) // This is only ok if( mpfr_regular_p(.) ), i.e. not for {0, NaN, Inf}: # define R_mpfr_FILL_DVEC(i) \ R_mpfr_dbg_printf(2,"r..d[i=%d] = 0x%lx\n",i,r->_mpfr_d[i]); \ dd[2*i] = (int) RIGHT_HALF(r->_mpfr_d[i]); \ dd[2*i+1]= (int) (r->_mpfr_d[i] >> 32) # define R_mpfr_GET_DVEC(i) \ r->_mpfr_d[i] = (mp_limb_t)(RIGHT_HALF(dd[2*i]) | LEFT_SHIFT(dd[2*i+1])); \ R_mpfr_dbg_printf(2,"dd[%d:%d]= (%10lu,%10lu) -> r..d[i=%d]= 0x%lx\n", \ 2*i,2*i+1, dd[2*i],dd[2*i+1], i,r->_mpfr_d[i]) # define R_mpfr_FILL_EXP \ R_mpfr_dbg_printf(2,"_exp = 0x%lx\n",r->_mpfr_exp); \ ex[0] = (int) RIGHT_HALF(r->_mpfr_exp); \ ex[1] = (int) (r->_mpfr_exp >> 32) # define R_mpfr_GET_EXP \ r->_mpfr_exp = (mpfr_exp_t) (RIGHT_HALF(ex[0]) | LEFT_SHIFT(ex1)); \ R_mpfr_dbg_printf(2,"ex[0:1]= (%10lu,%10lu) -> _exp = 0x%lx\n", \ ex[0],ex1, r->_mpfr_exp) /*------------------------*/ #else # error "will not happen" #endif #define R_mpfr_MPFR_2R_fill \ /* now fill the slots of val */ \ INTEGER(prec_R)[0] = (int)r->_mpfr_prec; \ INTEGER(sign_R)[0] = (int)r->_mpfr_sign; \ R_mpfr_FILL_EXP; \ if(regular_p) { \ /* the full *vector* of limbs : */ \ for(i=0; i < nr_limbs; i++) { \ R_mpfr_FILL_DVEC(i); \ } \ } /* Return an R "mpfr1" object corresponding to mpfr input: */ SEXP MPFR_as_R(mpfr_t r) { int nr_limbs = R_mpfr_nr_limbs(r), regular_p = mpfr_regular_p(r), i; R_mpfr_MPFR_2R_init(val, (regular_p ? R_mpfr_nr_ints : 0)); R_mpfr_MPFR_2R_fill; UNPROTECT(6); return val; } SEXP d2mpfr1_(double x, int i_prec, mpfr_rnd_t rnd) { mpfr_t r; int nr_limbs = N_LIMBS(i_prec), regular_p, i; R_mpfr_check_prec(i_prec); mpfr_init2 (r, (mpfr_prec_t)i_prec); mpfr_set_d (r, x, rnd); regular_p = mpfr_regular_p(r); R_mpfr_MPFR_2R_init(val, (regular_p ? R_mpfr_nr_ints : 0)); R_mpfr_MPFR_2R_fill; /* free space used by the MPFR variables */ mpfr_clear (r); mpfr_free_cache(); /* <- Manual 4.8 "Memory Handling" strongly advises ...*/ UNPROTECT(6); return val; }/* d2mpfr1_ */ /** * Translate an "R rounding mode" into the correct MPFR one * * @param rnd_mode: an R character (string with nchar() == 1). * * @return one of the (currently 4) different MPFR_RND[DNUZ] modes. */ mpfr_rnd_t R_rnd2MP(SEXP rnd_mode) { const char* r_ch = CHAR(asChar(rnd_mode)); switch(r_ch[0]) { case 'D': return MPFR_RNDD; case 'N': return MPFR_RNDN; case 'U': return MPFR_RNDU; case 'Z': return MPFR_RNDZ; case 'A': return MPFR_RNDA; // since MPFR 3.0.0 default: error(_("illegal rounding mode '%s'; must be one of {'D','N','U','Z','A'}"), r_ch); /* Wall: */ return MPFR_RNDN; } } SEXP d2mpfr1(SEXP x, SEXP prec, SEXP rnd_mode) { if(LENGTH(x) != 1) error("length(x) (=%d) is not 1", LENGTH(x)); return d2mpfr1_(asReal(x), asInteger(prec), R_rnd2MP(rnd_mode)); } SEXP d2mpfr1_list(SEXP x, SEXP prec, SEXP rnd_mode) { int nx = LENGTH(x), np = LENGTH(prec), n = (nx == 0 || np == 0) ? 0 : imax2(nx, np), nprot = 1; SEXP val = PROTECT(allocVector(VECSXP, n)); if(nx > 0) { mpfr_rnd_t rnd = R_rnd2MP(rnd_mode); if(!isReal(x)) { PROTECT(x = coerceVector(x, REALSXP)); nprot++; } if(!isInteger(prec)) { PROTECT(prec = coerceVector(prec, INTSXP)); nprot++; } double *dx = REAL(x); int *iprec = INTEGER(prec); for(int i = 0; i < n; i++) { /* FIXME: become more efficient by doing R_mpfr_MPFR_2R_init() only once*/ SET_VECTOR_ELT(val, i, d2mpfr1_(dx[i % nx], iprec[i % np], rnd)); } } UNPROTECT(nprot); return val; } /* -- Function: int mpfr_set_z (mpfr_t ROP, mpz_t OP, mpfr_rnd_t RND) -- Function: int mpfr_set_q (mpfr_t ROP, mpq_t OP, mpfr_rnd_t RND) --> would want functions SEXP mpz2mpfr1_(mpz_t x, int i_prec, mpfr_rnd_t rnd); SEXP mpz2mpfr1 (SEXP x, SEXP prec, SEXP rnd_mode); SEXP mpz2mpfr1_list(SEXP x, SEXP prec, SEXP rnd_mode); {and the same for 'q' instead of 'z'} completely parallel to the d2mpfr*() functions above *BUT* we cannot easily do the [R package gmp C++ code]-part of SEXP -> mpz ! MM - FIXME: still do it .. should not be so hard to "guess" ... horrifically, ... for now, R's ..bigq2mpfr(), ..bigz2mpfr() "simply" go via character strings */ /* From the MPFR (2.3.2, 2008) doc : -- Function: int mpfr_set_str (mpfr_t ROP, const char *S, int BASE, mpfr_rnd_t RND) Set ROP to the value of the whole string S in base BASE, rounded in the direction RND. See the documentation of `mpfr_strtofr' for a detailed description of the valid string formats. This function returns 0 if the entire string up to the final null character is a valid number in base BASE; otherwise it returns -1, and ROP may have changed. */ SEXP str2mpfr1_list(SEXP x, SEXP prec, SEXP base, SEXP rnd_mode) { /* NB: Both x and prec are "recycled" to the longer one if needed */ int ibase = asInteger(base), *iprec, nx = LENGTH(x), np = LENGTH(prec), n = (nx == 0 || np == 0) ? 0 : imax2(nx, np), nprot = 1; SEXP val = PROTECT(allocVector(VECSXP, n)); mpfr_rnd_t rnd = R_rnd2MP(rnd_mode); mpfr_t r_i; mpfr_init(r_i); if(!isString(x)) { PROTECT(x = coerceVector(x, STRSXP)); nprot++; } if(!isInteger(prec)) { PROTECT(prec = coerceVector(prec, INTSXP)); nprot++; } iprec = INTEGER(prec); for(int i = 0; i < n; i++) { int prec_i = iprec[i % np]; R_mpfr_check_prec(prec_i); mpfr_set_prec(r_i, (mpfr_prec_t) prec_i); int ierr = mpfr_set_str(r_i, CHAR(STRING_ELT(x, i % nx)), ibase, rnd); if(ierr) { if (!strcmp("NA", CHAR(STRING_ELT(x, i % nx)))) mpfr_set_nan(r_i); // "NA" <=> "NaN" (which *are* treated well, by mpfr_set_str) else error("str2mpfr1_list(x, *): x[%d] cannot be made into MPFR", i+1); } /* FIXME: become more efficient by doing R_mpfr_MPFR_2R_init() only once*/ SET_VECTOR_ELT(val, i, MPFR_as_R(r_i)); } mpfr_clear (r_i); mpfr_free_cache(); UNPROTECT(nprot); return val; } #undef R_mpfr_MPFR_2R_init #undef R_mpfr_MPFR_2R_fill #ifdef _not_used_ /* This does *not* work: gives *empty* .Data slot [bug in NEW_OBJECT()? ] */ SEXP d2mpfr(SEXP x, SEXP prec) { int i_prec = asInteger(prec), nx = LENGTH(x), np = LENGTH(prec), n = (nx == 0 || np == 0) ? 0 : imax2(nx, np), nprot = 1; SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("mpfr"))), lis = ALLOC_SLOT(val, Rmpfr_Data_Sym, VECSXP, n); double *dx; if(!isReal(x)) { PROTECT(x = coerceVector(x, REALSXP)); nprot++; } REprintf("d2mpfr(x, prec): length(x) = %d, prec = %d -> length(lis) = %d\n", nx, i_prec, LENGTH(lis)); dx = REAL(x); for(int i = 0; i < n; i++) { SET_VECTOR_ELT(lis, i, duplicate(d2mpfr1_(dx [i % nx], i_prec [i % np]))); } UNPROTECT(nprot); return val; } #endif /* The inverse of MPFR_as_R() : * From an R "mpfr1" object, (re)build an mpfr one: */ void R_asMPFR(SEXP x, mpfr_ptr r) { SEXP prec_R = GET_SLOT(x, Rmpfr_precSym); // SEXP sign_R = GET_SLOT(x, Rmpfr_signSym);// only used once SEXP exp_R = GET_SLOT(x, Rmpfr_expSym); SEXP d_R = GET_SLOT(x, Rmpfr_d_Sym); int x_prec = INTEGER(prec_R)[0], nr_limbs = N_LIMBS(x_prec), i; Rboolean regular_x = length(d_R) > 0; int *dd = INTEGER(d_R),/* the vector which makes up the mantissa */ *ex = INTEGER(exp_R), ex1; /* the one for the exponent */ if(regular_x && length(d_R) != R_mpfr_nr_ints) error("nr_limbs(x_prec)= nr_limbs(%d)= %d : length() == %d != R_mpfr_nr_ints == %d", x_prec, nr_limbs, length(d_R), R_mpfr_nr_ints); if(length(exp_R) < R_mpfr_exp_size) { if(length(exp_R) == 0) error("'exp' slot has length 0"); /* else: we got a 32-bit one in a 64-bit system */ ex1 = 0; } else ex1 = ex[1]; mpfr_set_prec(r, (mpfr_prec_t) x_prec); r->_mpfr_sign = (mpfr_sign_t) INTEGER(GET_SLOT(x, Rmpfr_signSym))[0]; R_mpfr_GET_EXP; if(regular_x) /* the full *vector* of limbs : */ for(i=0; i < nr_limbs; i++) { R_mpfr_GET_DVEC(i); } return; } #ifdef R_had_R_Outputfile_in_API #ifndef WIN32 /* This only works on "unix-alikes" ... but we don't really need it */ /* for R_Outputfile : */ #include SEXP print_mpfr1(SEXP x, SEXP digits) { mpfr_t r; Rboolean use_x_digits = INTEGER(digits)[0] == NA_INTEGER; mpfr_init2(r, R_mpfr_prec(x)); R_asMPFR(x, r); /* Rprintf(" * [dbg] after R_asMPFR() ..\n"); */ mpfr_out_str (R_Outputfile, 10, use_x_digits ? 0 : asInteger(digits), r, MPFR_RNDD); /* prints the value of s in base 10, rounded towards -Inf, where the third argument 0 means that the number of printed digits is automatically chosen from the precision of s; */ Rprintf("\n"); mpfr_clear (r); mpfr_free_cache(); /* <- Manual 4.8 "Memory Handling" strongly advises ...*/ return x; } SEXP print_mpfr(SEXP x, SEXP digits) { SEXP D = GET_SLOT(x, Rmpfr_Data_Sym);/* an R list() of length n */ int n = length(D), i; mpfr_t r; Rboolean use_x_digits = INTEGER(digits)[0] == NA_INTEGER; /* #if MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0) */ /* char buf[R_BUFSIZE], *p = buf; */ /* #endif */ mpfr_init(r); /* with default precision */ for(i=0; i < n; i++) { R_asMPFR(VECTOR_ELT(D, i), r); /* #if MPFR_VERSION >= MPFR_VERSION_NUM(2,4,0) */ /* Rprintf */ /* #else /\* requires R_Outputfile from R's Interfaces.h ___Unix-alike only__ *\/ */ mpfr_out_str (R_Outputfile, 10, use_x_digits ? 0 : asInteger(digits), r, MPFR_RNDD); /* #endif */ Rprintf("\n"); } mpfr_clear (r); mpfr_free_cache(); /* <- Manual 4.8 "Memory Handling" strongly advises ...*/ return x; } #endif /* ^^^ Unix-alike only */ #endif /* Convert R "mpfr" object (list of "mpfr1") to R "double" vector : */ SEXP mpfr2d(SEXP x, SEXP rnd_mode) { int n = length(x), i; SEXP val = PROTECT(allocVector(REALSXP, n)); double *r = REAL(val); mpfr_t R_i; mpfr_init(R_i); /* with default precision */ for(i=0; i < n; i++) { R_asMPFR(VECTOR_ELT(x, i), R_i); r[i] = mpfr_get_d(R_i, R_rnd2MP(rnd_mode)); } mpfr_clear (R_i); mpfr_free_cache(); UNPROTECT(1); return val; } /* Convert R "mpfr" object (list of "mpfr1") to R "integer" vector : */ SEXP mpfr2i(SEXP x, SEXP rnd_mode) { int n = length(x), i; SEXP val = PROTECT(allocVector(INTSXP, n)); int *r = INTEGER(val); mpfr_t R_i; mpfr_init(R_i); /* with default precision */ for(i=0; i < n; i++) { R_asMPFR(VECTOR_ELT(x, i), R_i); if(!mpfr_fits_sint_p(R_i, R_rnd2MP(rnd_mode))) { warning("NAs introduced by coercion from \"mpfr\" [%d]", i+1); r[i] = NA_INTEGER; } else { long lr = mpfr_get_si(R_i, R_rnd2MP(rnd_mode)); r[i] = (int) lr; } } mpfr_clear (R_i); mpfr_free_cache(); UNPROTECT(1); return val; } /* Get "format info" from R "mpfr" object -- into list with (exp, finite, is.0), * a subset of mpfr2str() [below] : ---> see also R_mpfr_exp() in ./utils.c * */ SEXP R_mpfr_formatinfo(SEXP x) { int n = length(x); static const char *ans_nms[] = {"exp", "finite", "is.0", ""}; SEXP val = PROTECT(mkNamed(VECSXP, ans_nms)), exp, fini, zero; int erange_is_int = mpfr_erange_int_p(); SEXPTYPE exp_SXP = (erange_is_int ? INTSXP : REALSXP); SET_VECTOR_ELT(val, 0, exp = PROTECT(allocVector(exp_SXP,n))); SET_VECTOR_ELT(val, 1, fini= PROTECT(allocVector(LGLSXP, n))); SET_VECTOR_ELT(val, 2, zero= PROTECT(allocVector(LGLSXP, n))); int *is_fin= LOGICAL(fini), *is_0 = LOGICAL(zero); mpfr_t R_i; mpfr_init(R_i); if(erange_is_int) { int *exp_ = INTEGER(exp); #define FOR_I_N_ASSIGN(exp_typ) \ for(int i=0; i < n; i++) { \ R_asMPFR(VECTOR_ELT(x, i), R_i); \ exp_ [i] = (exp_typ) mpfr_get_exp(R_i); \ is_fin[i] = mpfr_number_p(R_i); \ is_0 [i] = mpfr_zero_p(R_i); \ } FOR_I_N_ASSIGN(int) } else {/* 'exp' needs to use "double" as it may not fit into integer, consistent with R_mpfr_get_erange(), or R_mpfr_prec_range() : */ double *exp_ = REAL(exp); FOR_I_N_ASSIGN(double) } mpfr_clear (R_i); mpfr_free_cache(); UNPROTECT(4); return val; } /* Convert R "mpfr" object (list of "mpfr1") to R "character" vector, * using 'digits' (or determinining it): * 1) digits = NULL , maybe_full = FALSE (<==> 'scientific = TRUE') * --------------- -------------~~~~~ ==> set digits <=> getPrec(x) * 2) digits = NULL , maybe_full = TRUE (<=> 'scientific' = NA or FALSE in the calling formatMpfr() * ------------- ----------------- ==> set digits <=> max(getPrec(x), #{"digits left of '.'"}) * 3) digits = , maybe_full = TRUE (<=> 'scientific' = TRUE in the calling formatMpfr() * ------------- -----------------==> set digits <=> max(digit, getPrec(x), #{"digits left of '.'"})) * * Rmpfr:::.mpfr_debug(1) ==> to add debug output here */ SEXP mpfr2str(SEXP x, SEXP digits, SEXP maybeFull, SEXP base) { int n = length(x), i; int B = asInteger(base); // = base for output int n_dig = isNull(digits) ? 0 : asInteger(digits); if(n_dig < 0) error("'digits' must be NULL or a positive integer"); Rboolean maybe_full = asLogical(maybeFull); if(maybe_full == NA_LOGICAL) // cannot happen when called "regularly" error("'maybe.full' must be TRUE or FALSE"); R_mpfr_dbg_printf(1,"mpfr2str(*, digits=%d, maybeF=%s, base=%d):\n", n_dig, (maybe_full ? "TRUE" : "False"), B); /* int dig_n_max = -1; */ /* SEXP val = PROTECT(allocVector(VECSXP, 4)), */ /* nms, str, exp, fini, zero; */ /* int *i_exp, *is_fin, *is_0; */ char *ch = NULL; /* N_digits == 1 , for base = 2, 4, 8, 16, 32 (base <= 62 !) gives bad abort from MPFR: get_str.c:2306: MPFR assertion failed: m >= 2 || ((((b) & ((b) - 1)) == 0) == 0 && m >= 1) ... Aborted ... (Speicherabzug geschrieben) the MPFR doc (see mpfr_get_str below) *says* N >= 2 is required, but we have used N = 1 for B = 10 a lot in the past ! */ Rboolean base_is_2_power = (B == 2 || B == 4 || B == 8 || B == 16 || B == 32); Rboolean n_dig_1_problem = (n_dig == 1) && base_is_2_power; size_t N_digits = n_dig_1_problem ? 2 : n_dig; static const char *ans_nms[] = {"str", "exp", "finite", "is.0", ""}; SEXP val = PROTECT(mkNamed(VECSXP, ans_nms)), str, exp, fini, zero; // NB: 'exp' may have to be 'double' instead of 'integer', when erange allows large exponents int erange_is_int = mpfr_erange_int_p(); SEXPTYPE exp_SXP = (erange_is_int ? INTSXP : REALSXP); SET_VECTOR_ELT(val, 0, str = PROTECT(allocVector(STRSXP, n))); SET_VECTOR_ELT(val, 1, exp = PROTECT(allocVector(exp_SXP,n))); SET_VECTOR_ELT(val, 2, fini= PROTECT(allocVector(LGLSXP, n))); SET_VECTOR_ELT(val, 3, zero= PROTECT(allocVector(LGLSXP, n))); // depending on erange_is_int, only need one of d_exp or i_exp (but don't see a more elegant way): double *d_exp; // = REAL(exp); int *i_exp, // = INTEGER(exp), *is_fin= LOGICAL(fini), *is_0 = LOGICAL(zero); double p_fact = (B == 2) ? 1. : log(B) / M_LN2;// <==> P / p_fact == P *log(2)/log(B) int max_nchar = -1; // := max_i { dig_needed[i] } mpfr_t R_i; mpfr_init(R_i); /* with default precision */ if(erange_is_int) i_exp = INTEGER(exp); else d_exp = REAL(exp); for(i=0; i < n; i++) { mpfr_exp_t exp = (mpfr_exp_t) 0; mpfr_exp_t *exp_ptr = &exp; int nchar_i; Rboolean use_nchar = TRUE; R_asMPFR(VECTOR_ELT(x, i), R_i); int is0 = mpfr_zero_p(R_i); int isFin = mpfr_number_p(R_i); is_0 [i] = is0; is_fin[i] = isFin; if(N_digits) {/* use it as desired precision */ nchar_i = N_digits; R_mpfr_dbg_printf(1,"N_digits: [i=%d]: ... -> dig.n = %d ", i, nchar_i); } else if(!isFin) { nchar_i = 5; // @Inf@ @NaN@ } else if(is0) { nchar_i = 1 + base_is_2_power; } else { /* N_digits = 0 --> string must use "enough" digits */ // MPFR doc on mpfr_get_str(): use 'm + 1' where m = 1+ceil(P * log(2)/log(B)) double P = (double)R_i->_mpfr_prec; if(base_is_2_power) P--; // P := P-1 iff B is a power of 2 double m1 = 1 + ceil(P / p_fact) + 1; double dchar_i = maybe_full ? // want all digits before "." : fmax2(m1, ceil((double)mpfr_get_exp(R_i) / p_fact)) : m1; if(dchar_i > 536870912 /* = 2^29 */) // << somewhat arbitrary but < INT_MAX ~= 2^31-1 error(_(".mpfr2str(): too large 'dchar_i = %g'; please set 'digits = '"), dchar_i); nchar_i = (int) dchar_i; R_mpfr_dbg_printf(1," [i=%d]: prec=%ld, exp2=%ld -> (nchar_i,dig.n)=(%g,%d) ", i, R_i->_mpfr_prec, mpfr_get_exp(R_i), dchar_i, nchar_i); if(nchar_i <= 1 && base_is_2_power) { // have n_dig_problem: R_mpfr_dbg_printf_0(1," base_is_2_power & nchar_i=%d ==> fudge dig_n. := 2"); nchar_i = 2; } use_nchar = FALSE; } if (i == 0) { /* first time */ max_nchar = nchar_i; ch = (char *) R_alloc(imax2(max_nchar + 2, 7), // 7 : '-@Inf@' (+ \0)n_str, sizeof(char)); } else if(!N_digits && nchar_i > max_nchar) { // enlarge : ch = (char *) S_realloc(ch, imax2( nchar_i + 2, 7), imax2(max_nchar + 2, 7), sizeof(char)); max_nchar = nchar_i; } /* char* mpfr_get_str (char *STR, mpfr_exp_t *EXPPTR, int B, * size_t N, mpfr_t OP, mpfr_rnd_t RND) Convert OP to a string of digits in base B, with rounding in the direction RND, where N is either zero (see below) or the number of significant digits output in the string; in the latter case, N must be greater or equal to 2. The base may vary from 2 to 62; ......... ......... ==> MPFR info manual "5.4 Conversion Functions" */ R_mpfr_dbg_printf_0(1," .. max_nchar=%d\n", max_nchar); /* // use nchar_i notably when that is smaller than max_nchar : */ /* mpfr_get_str(ch, exp_ptr, B, (size_t) nchar_i, R_i, MPFR_RNDN); */ /* ---- alternatively, * N = 0 : MPFR finds the number of digits needed : */ mpfr_get_str(ch, exp_ptr, B, (size_t) (maybe_full || use_nchar) ? nchar_i : 0, //========== --- R_i, MPFR_RNDN); SET_STRING_ELT(str, i, mkChar(ch)); if(erange_is_int) i_exp [i] = (int) exp_ptr[0]; else d_exp [i] = (double) exp_ptr[0]; } mpfr_clear (R_i); mpfr_free_cache(); UNPROTECT(5); return val; } /* R ldexpMpfr(f, E) * * return "mpfr" x = f * 2^E where 'f' is "mpfr" and 'E' is "integer". * ------- * "Problem": here, the exponent is limited to +/- 2^31-1 ("ok" with default erange; * but the maximal erange is +- 2^61 which corresponds to *two* 32-bit integers */ SEXP R_mpfr_ldexp(SEXP f, SEXP E, SEXP rnd_mode) { /* NB: Allow *recycling* for (f, E) * -- using 'mismatch' and the MISMATCH macros */ mpfr_rnd_t rnd = R_rnd2MP(rnd_mode); int nprot = 0; if(!isInteger(E)) { PROTECT(E = coerceVector(E, INTSXP)); nprot++; } int *ee = INTEGER(E), nx = length(f), ny = length(E), // instead of 'nf, nE' for MISMATCH macros n = (nx == 0 || ny == 0) ? 0 : imax2(nx, ny), mismatch = 0; SEXP val = PROTECT(allocVector(VECSXP, n)); nprot++; mpfr_t x_i; mpfr_init(x_i); /* with default precision */ SET_MISMATCH; for(int i=0; i < n; i++) { R_asMPFR(VECTOR_ELT(f, i % nx), x_i); mpfr_mul_2si(x_i, x_i, (long) ee[i % ny], rnd); /* -- Function: int mpfr_mul_2si (mpfr_t ROP, mpfr_t OP1, long int OP2, mpfr_rnd_t RND) Set ROP to OP1 times 2 raised to OP2 rounded in the direction RND. Just increases the exponent by OP2 when ROP and OP1 are identical. */ SET_VECTOR_ELT(val, i, MPFR_as_R(x_i)); } MISMATCH_WARN; mpfr_clear (x_i); mpfr_free_cache(); UNPROTECT(nprot); return val; } #ifdef _not_yet_ /* For R functionality: from "mpfr" x, return list(z, E), * z = "bigz", E = "integer" (or integer-valued double) such that x = z * 2^E exactly */ SEXP R_mpfr_get_2exp(SEXP x) { /*-- Function: mpfr_exp_t mpfr_get_z_2exp (mpz_t ROP, mpfr_t OP) Put the scaled significand of OP (regarded as an integer, with the precision of OP) into ROP, and return the exponent EXP (which may be outside the current exponent range) such that OP exactly equals ROP times 2 raised to the power EXP. If OP is zero, the minimal exponent ‘emin’ is returned. If OP is NaN or an infinity, the _erange_ flag is set, ROP is set to 0, and the the minimal exponent ‘emin’ is returned. The returned exponent may be less than the minimal exponent ‘emin’ of MPFR numbers in the current exponent range; in case the exponent is not representable in the ‘mpfr_exp_t’ type, the _erange_ flag is set and the minimal value of the ‘mpfr_exp_t’ type is returned. */ // placeholder -- FIXME ! return R_Nilvalue; } #endif // _not_yet_ // R frexpMpfr(x) |-> list(r, e) SEXP R_mpfr_frexp(SEXP x, SEXP rnd_mode) { mpfr_rnd_t rnd = R_rnd2MP(rnd_mode); // NB: 'exp' may have to be 'double' instead of 'integer', when erange allows large exponents int erange_is_int = mpfr_erange_int_p(); SEXPTYPE exp_SXP = (erange_is_int ? INTSXP : REALSXP); int n = length(x); static const char *ans_nms[] = {"r", "e", ""}; SEXP ans = PROTECT(mkNamed(VECSXP, ans_nms)), r, e; // r: fractional parts; still "mpfr" numbers: SET_VECTOR_ELT(ans, 0, r = PROTECT(duplicate(x))); // e: 2-exponents (integer or double see aboe) SET_VECTOR_ELT(ans, 1, e = PROTECT(allocVector(exp_SXP, n))); int *ei_; double *ed_; if(erange_is_int) ei_ = INTEGER(e); else ed_ = REAL(e); mpfr_t x_i, y_i; mpfr_init(x_i); mpfr_init(y_i); mpfr_exp_t Ex = (mpfr_exp_t)0; // create and initialize "valgrindably" // Rboolean int_ok = TRUE; for(int i=0; i < n; i++) { R_asMPFR(VECTOR_ELT(x, i), x_i); mpfr_set_prec(y_i, mpfr_get_prec(x_i)); int ierr = mpfr_frexp(&Ex, y_i, x_i, rnd); /*-- Function: int mpfr_frexp (mpfr_exp_t *EXP, mpfr_t Y, mpfr_t X, mpfr_rnd_t RND) Set EXP (formally, the value pointed to by EXP) and Y such that 0.5<=abs(Y)<1 and Y times 2 raised to EXP equals X rounded to the precision of Y, using the given rounding mode. If X is zero, then Y is set to a zero of the same sign and EXP is set to 0. If X is NaN or an infinity, then Y is set to the same value and EXP is undefined. */ if(ierr) { #define MPFR_CLEAR mpfr_clear(x_i); mpfr_clear(y_i); mpfr_free_cache() MPFR_CLEAR; error("R_mpfr_frexp(): mpfr_frexp(x[%d]) gave error code %d\n", i+1, ierr); } if(erange_is_int) ei_[i] = (int) Ex; else ed_[i] = (double) Ex; SET_VECTOR_ELT(r, i, MPFR_as_R(y_i)); } MPFR_CLEAR; UNPROTECT(3); return ans; } // TODO : get *exact* as.bigq.mpfr(), i.e, "mpfr" --> "bigq". (R's "bigq" is C 'mpq') // ---- inside the GMP library, have // _________ // -- Function: void mpq_set_f (mpq_t ROP, const mpf_t OP) // ^^^^^^^^^ // Set ROP to the value of OP. // There is no rounding, this conversion is **exact**. /* ---not-yet--- #include */ /* maybe we only need very little of the above, such as #define mpf_t mpfr_t --------------------- ? */ Rmpfr/src/init.c0000644000175000017500000001107514107223103013365 0ustar nileshnilesh/* Setup here "copied" from Matrix package */ #include #define _in_Rmpfr_init_ #include "Rmpfr_utils.h" #include "Syms.h" #undef _in_Rmpfr_init_ #define CALLDEF(name, n) {#name, (DL_FUNC) &name, n} static R_CallMethodDef CallEntries[] = { CALLDEF(d2mpfr1, 3), CALLDEF(d2mpfr1_list, 3), #ifdef Have_interface_Rmpfr_gmp CALLDEF(mpz2mpfr1, 3), CALLDEF(mpz2mpfr1_list, 3), #endif #ifdef R_had_R_Outputfile_in_API #ifndef WIN32 /* only works on "unix-alikes" */ CALLDEF(print_mpfr, 2), CALLDEF(print_mpfr1, 2), #endif #endif CALLDEF(mpfr2d, 2), CALLDEF(mpfr2i, 2), CALLDEF(mpfr2str, 4), CALLDEF(R_mpfr_formatinfo, 1), CALLDEF(R_mpfr_2exp, 1), CALLDEF(R_mpfr_frexp, 2), CALLDEF(R_mpfr_ldexp, 3), CALLDEF(str2mpfr1_list, 4), CALLDEF(Rmpfr_minus, 1), CALLDEF(Rmpfr_abs, 1), CALLDEF(Math_mpfr, 2), CALLDEF(Arith_mpfr, 3), CALLDEF(Arith_mpfr_i, 3), CALLDEF(Arith_i_mpfr, 3), CALLDEF(Arith_mpfr_d, 3), CALLDEF(Arith_d_mpfr, 3), CALLDEF(Compare_mpfr, 3), CALLDEF(Compare_mpfr_i, 3), CALLDEF(Compare_mpfr_d, 3), CALLDEF(Summary_mpfr, 3), CALLDEF(R_mpfr_sumprod, 4), CALLDEF(R_mpfr_set_debug, 1), CALLDEF(R_mpfr_set_default_prec, 1), CALLDEF(R_mpfr_get_default_prec, 0), CALLDEF(R_mpfr_prec_range, 1), CALLDEF(R_mpfr_get_erange, 1), CALLDEF(R_mpfr_set_erange, 2), CALLDEF(R_mpfr_erange_int_p, 0), CALLDEF(R_mpfr_get_version, 0), CALLDEF(R_mpfr_get_GMP_numb_bits, 0), CALLDEF(const_asMpfr, 3), CALLDEF(R_mpfr_is_finite, 1), CALLDEF(R_mpfr_is_finite_A, 1), CALLDEF(R_mpfr_is_infinite, 1), CALLDEF(R_mpfr_is_infinite_A, 1), CALLDEF(R_mpfr_is_integer, 1), CALLDEF(R_mpfr_is_integer_A, 1), CALLDEF(R_mpfr_is_na, 1), CALLDEF(R_mpfr_is_na_A, 1), CALLDEF(R_mpfr_is_zero, 1), CALLDEF(R_mpfr_is_zero_A, 1), CALLDEF(R_mpfr_atan2, 3), CALLDEF(R_mpfr_igamma, 3), CALLDEF(R_mpfr_hypot, 3), CALLDEF(R_mpfr_beta, 3), CALLDEF(R_mpfr_lbeta, 3), CALLDEF(R_mpfr_jn, 3), CALLDEF(R_mpfr_yn, 3), CALLDEF(R_mpfr_fac, 3), CALLDEF(R_mpfr_choose, 3), CALLDEF(R_mpfr_poch, 3), CALLDEF(R_mpfr_round, 3), {NULL, NULL, 0} }; void #ifdef HAVE_VISIBILITY_ATTRIBUTE __attribute__ ((visibility ("default"))) #endif R_init_Rmpfr(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); #define RREGDEF(name) R_RegisterCCallable("Rmpfr", #name, (DL_FUNC) name) RREGDEF(d2mpfr1); RREGDEF(d2mpfr1_list); #ifdef Have_interface_Rmpfr_gmp RREGDEF(mpz2mpfr1); RREGDEF(mpz2mpfr1_list); #endif #ifdef R_had_R_Outputfile_in_API #ifndef WIN32 RREGDEF(print_mpfr); RREGDEF(print_mpfr1); #endif #endif RREGDEF(mpfr2d); RREGDEF(mpfr2i); RREGDEF(mpfr2str); RREGDEF(str2mpfr1_list); RREGDEF(Rmpfr_minus); RREGDEF(Rmpfr_abs); RREGDEF(Math_mpfr); RREGDEF(Arith_mpfr); RREGDEF(Arith_mpfr_i); RREGDEF(Arith_i_mpfr); RREGDEF(Arith_mpfr_d); RREGDEF(Arith_d_mpfr); RREGDEF(Compare_mpfr); RREGDEF(Compare_mpfr_i); RREGDEF(Compare_mpfr_d); RREGDEF(Summary_mpfr); RREGDEF(R_mpfr_sumprod); RREGDEF(R_mpfr_set_debug); RREGDEF(R_mpfr_set_default_prec); RREGDEF(R_mpfr_get_default_prec); RREGDEF(R_mpfr_get_version); RREGDEF(R_mpfr_get_GMP_numb_bits); RREGDEF(const_asMpfr); RREGDEF(R_mpfr_is_finite); RREGDEF(R_mpfr_is_finite_A); RREGDEF(R_mpfr_is_infinite); RREGDEF(R_mpfr_is_infinite_A); RREGDEF(R_mpfr_is_integer); RREGDEF(R_mpfr_is_integer_A); RREGDEF(R_mpfr_is_na); RREGDEF(R_mpfr_is_na_A); RREGDEF(R_mpfr_is_zero); RREGDEF(R_mpfr_is_zero_A); RREGDEF(R_mpfr_jn); RREGDEF(R_mpfr_yn); RREGDEF(R_mpfr_atan2); RREGDEF(R_mpfr_hypot); RREGDEF(R_mpfr_igamma); RREGDEF(R_mpfr_beta); RREGDEF(R_mpfr_lbeta); RREGDEF(R_mpfr_fac); RREGDEF(R_mpfr_choose); RREGDEF(R_mpfr_poch); RREGDEF(R_mpfr_round); /* Sync this with declarations in ./Syms.h : */ Rmpfr_precSym = install("prec"); Rmpfr_signSym = install("sign"); Rmpfr_expSym = install("exp"); Rmpfr_d_Sym = install("d"); Rmpfr_Data_Sym = install(".Data"); Rmpfr_Dim_Sym = install("Dim"); Rmpfr_Dimnames_Sym = install("Dimnames"); /* not suppressable, hence moved to suppressable R startup code: Rprintf("Loading C code of R package 'Rmpfr': GMP using %d bits per limb\n", GMP_NUMB_BITS); */ /* if(GMP_NUMB_BITS != 32) */ /* error("The Rmpfr package currently needs 32-bit limbs"); */ } /* void R_unload_Rmpfr(DllInfo *dll) */ /* { */ /* } */ Rmpfr/src/Syms.h0000644000175000017500000000026112443134043013362 0ustar nileshnileshSEXP // keep in sync with ./init.c Rmpfr_precSym, Rmpfr_signSym, Rmpfr_expSym, Rmpfr_d_Sym, Rmpfr_Data_Sym, Rmpfr_Dim_Sym, Rmpfr_Dimnames_Sym ; Rmpfr/vignettes/0000755000175000017500000000000014136173546013514 5ustar nileshnileshRmpfr/vignettes/Rmpfr.bib0000644000175000017500000000460012250313503015240 0ustar nileshnilesh@Manual{MM-Rmpfr_pkg, title = {Rmpfr: R MPFR - Multiple Precision Floating-Point Reliable}, author = {Martin Maechler}, year = 2011, url = {http://rmpfr.r-forge.r-project.org/}, note = {R package version 0.4-2} } @article{FouLHLPZ:2007, author = {Laurent Fousse and Guillaume Hanrot and Vincent Lef\`{e}vre and Patrick P\'{e}lissier and Paul Zimmermann}, title = {MPFR: A multiple-precision binary floating-point library with correct rounding}, year = 2007, journal = {ACM Trans. Math. Softw.}, volume = 33, number = 2, issn = {0098-3500}, pages = 13, url = {http://doi.acm.org/10.1145/1236463.1236468}, acmid = 1236468, publisher = {ACM}, address = {New York, NY, USA}, keywords = {IEEE 754 standard, Multiple-precision arithmetic, correct rounding, elementary function, floating-point arithmetic, portable software}, } @comment not with jss.bst: @comment doi = {http://doi.acm.org/10.1145/1236463.1236468}, @manual{FousseHLPZ-MPFR:2011, author = {Fousse, Laurent and Hanrot, Guillaume and Lef\`{e}vre, Vincent and P\'{e}lissier, Patrick and Zimmermann, Paul}, year = 2011, title = {MPFR: A multiple-precision binary floating-point library with correct rounding}, url = {http://mpfr.org/}, } % Bauer:1961:ARI:366573.366594, @article{Bauer-1961, author = {Bauer, F. L.}, title = {Algorithm 60: Romberg integration}, journal = {Commun. ACM}, year = 1961, volume = 4, issue = 6, month = {June}, issn = {0001-0782}, pages = 255, url = {http://doi.acm.org/10.1145/366573.366594}, doi = {http://doi.acm.org/10.1145/366573.366594}, acmid = 366594, publisher = {ACM}, address = {New York, NY, USA}, } @manual{GMP:2011, author = {Torbjörn Granlund and the GMP development team}, year = 2011, title = {GNU MP - The GNU Multiple Precision Arithmetic Library}, url = {http://gmplib.org/}, } % citation(package="sfsmisc") @Manual{maechler-sfsmisc, title = {sfsmisc: Utilities from Seminar fuer Statistik ETH Zurich}, author = {Martin Maechler}, year = 2012, note = {R package version 1.0-23}, url = {http://CRAN.R-project.org/package=sfsmisc}, } @Manual{maechler-Bessel, title = {Bessel: Bessel -- Bessel Functions Computations and Approximations}, author = {Martin Maechler}, year = 2012, note = {R package version 0.5-4}, url = {http://CRAN.R-project.org/package=Bessel}, } Rmpfr/vignettes/log1mexp-note.Rnw0000644000175000017500000006607313735036657016724 0ustar nileshnilesh\documentclass[article,nojss]{jss}%-- the LONGER version %% NOTA BENE: More definitions --> further down %%%%%%%%%%%% % \author{Martin M\"achler \\ ETH Zurich% \\ April, Oct.\ 2012 {\tiny (\LaTeX'ed \today)}%---- for now } \title{Accurately Computing $\log(1 - \exp(-\abs{a}))$ \\ Assessed by the \pkg{Rmpfr} package} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Martin M\"achler} %% comma-separated \Plaintitle{% Accurately Computing log(1 - exp(.)) -- Assessed by Rmpfr} %\VignetteIndexEntry{Accurately Computing log(1 - exp(.)) -- Assessed by Rmpfr} %\VignetteDepends{Rmpfr} %\VignetteDepends{gmp} %\VignetteDepends{sfsmisc} \SweaveOpts{engine=R,strip.white=true, width=8.5, height=6} \SweaveOpts{pdf=FALSE, eps=FALSE, grdevice = pdfaCrop} % defined in R "<>": ^^^^^^^^ %% an abstract and keywords \Abstract{In this note, we explain how $f(a) = \log(1 - e^{-a}) =\log(1 - \exp(-a))$ can be computed accurately, in a simple and optimal manner, building on the two related auxiliary functions \code{log1p(x)} ($=\log(1+x)$) and \code{expm1(x)} ($=\exp(x)-1 = e^x - 1$). The cutoff, $a_0$, in use in \R{} since % version 1.9.0, April 2004, is shown to be optimal both theoretically and empirically, using \pkg{Rmpfr} high precision arithmetic. As an aside, we also show how to compute $\log\bigl(1 + e^x \bigr)$ accurately and efficiently. } \Keywords{Accuracy, Cancellation Error, R, MPFR, Rmpfr} %% at least one keyword must be supplied %% publication information %% NOTE: Typically, this can be left commented and will be filled out by the technical editor %% \Volume{13} %% \Issue{9} %% \Month{September} %% \Year{2004} %% \Submitdate{2004-09-29} %% \Acceptdate{2004-09-29} %% The address of (at least) one author should be given %% in the following format: \Address{ Martin M\"achler\\ Seminar f\"ur Statistik, HG G~16\\ ETH Zurich\\ 8092 Zurich, Switzerland\\ E-mail: \email{maechler@stat.math.ethz.ch}\\ URL: \url{http://stat.ethz.ch/people/maechler} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/1/31336-5053 %% Fax: +43/1/31336-734 %% for those who use Sweave please include the following line (with % symbols): %% MM: this is "substituted" by jss.cls: %% need no \usepackage{Sweave.sty} \usepackage[american]{babel}%for American English \usepackage{amsmath}%sophisticated mathematical formulas with amstex (includes \text{}) \usepackage{mathtools}%fix amsmath deficiencies \usepackage{amssymb}%sophisticated mathematical symbols with amstex (includes \mathbb{}) % \usepackage{amsthm}%theorem environments \usepackage{bm}%for bold math symbols: \bm (= bold math) \usepackage{enumitem}%for automatic numbering of new enumerate environments % This is already in jss above -- but withOUT the fontsize=\small part !! \DefineVerbatimEnvironment{Sinput}{Verbatim}{fontsize=\small,fontshape=sl} \DefineVerbatimEnvironment{Soutput}{Verbatim}{fontsize=\small} \DefineVerbatimEnvironment{Scode}{Verbatim}{fontsize=\small,fontshape=sl} %%~-~-~-~ Make space between Sinput and Soutput smaller: ~-~-~-~~-~-~-~~-~-~-~~-~-~-~~-~-~-~ %%--- Best advice, now from : % http://tex.stackexchange.com/questions/19359/reduce-space-between-sinput-and-soutput \newlength{\FVtopsep} \newlength{\FVpartopsep} \newlength{\FVparskip}% <- added as "no. 3" by MMa (after reading fancyvrb doc) \makeatletter \FV@AddToHook{\FV@ListParameterHook}{\topsep=\FVtopsep\partopsep=\FVpartopsep\parskip=\FVparskip} \makeatother % Control the spacing around the Sinput and Soutput environments by using the lengths % % \FVtopsep % \FVpartopsep % \FVparskip % % Both *topsep act quite similar most of the time, more details % can be found in the fancyvrb documentation on page 46. (MM: ==> I add FVparskip) %To kill all extra spacing between the environments, use {0pt} in all these %MM: When all three(!) are {0pt}, there's a large gap *after* Schunk (nothing in %between) %-- and that (end gap) get's smaller when I set all to {1pt} -- logic?? %___TODO/FIXME: Set of experiments (with smaller Sweave file)___ \setlength{\FVtopsep}{1pt} \setlength{\FVpartopsep}{1pt} \setlength{\FVparskip}{\parskip}% default: \parskip %%~-~-~-~ End {Sweave space handling} ~-~-~-~~-~-~-~~-~-~-~~-~-~-~~-~-~-~~-~-~~-~-~-~~-~-~ %% \setkeys{Gin}{width=\textwidth}% Sweave.sty has {width=0.8\textwidth} \newcommand*{\R}{\proglang{R}}%{\textsf{R}} \newcommand*{\CRANpkg}[1]{\href{http://CRAN.R-project.org/package=#1}{\pkg{#1}}} \newcommand*{\eps}{\varepsilon} %- \abs{ab} --> | ab | ``absolut Betrag'' \newcommand{\abs}[1] {\left| #1 \right|} % \renewcommand*{\S}{\operatorname*{S}} % \newcommand*{\tS}{\operatorname*{\tilde{S}}} % \newcommand*{\ran}{\operatorname*{ran}} %\newcommand*{\sgn}{\operatorname*{sgn}} \DeclareMathOperator{\sign}{sign} % \renewcommand*{\L}{\mathcal{L}} % \newcommand*{\Li}{\mathcal{L}^{-1}} % \newcommand*{\LS}{\mathcal{LS}} % \newcommand*{\LSi}{\LS^{-1}} \renewcommand*{\O}{\mathcal{O}} % \newcommand*{\Geo}{\operatorname*{Geo}} % \newcommand*{\Exp}{\operatorname*{Exp}} % \newcommand*{\Sibuya}{\operatorname*{Sibuya}} % \newcommand*{\Log}{\operatorname*{Log}} % \newcommand*{\U}{\operatorname*{U}} % \newcommand*{\B}{\operatorname*{B}} % \newcommand*{\NB}{\operatorname*{NB}} % \newcommand*{\N}{\operatorname*{N}} \DeclareMathOperator{\var}{var} \DeclareMathOperator{\Var}{Var} \DeclareMathOperator{\Cov}{Cov} \DeclareMathOperator{\cov}{cov} \DeclareMathOperator{\Cor}{Corr} \DeclareMathOperator{\cor}{corr} % \newcommand*{\Var}{\operatorname*{Var}} % \newcommand*{\Cov}{\operatorname*{Cov}} % \newcommand*{\Cor}{\operatorname*{Cor}} % % \newcommand*{\loglp}{\operatorname*{log1p}} % \newcommand*{\expml}{\operatorname*{expm1}} %% cannot use "1" in latex macro name -- use "l": \newcommand*{\loglp}{\mathrm{log1p}} \newcommand*{\expml}{\mathrm{expm1}} %% journal specific aliases \newcommand*{\setcapwidth}[1]{} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %% include your article here, just as usual %% Note that you should use the \pkg{}, \proglang{} and \code{} commands. % \section[About Java]{About \proglang{Java}} %% Note: If there is markup in \(sub)section, then it has to be escape as above. %% %% Note: These are explained in '?RweaveLatex' : <>= ## Our custom graphics device: pdfaCrop <- function(name, width, height, ...) { fn <- paste(name, "pdf", sep = ".") if(FALSE)## debug cat("pdfaCrop: fn = ",fn,"; call:\n\t",deparse(match.call()),"\n") grDevices::pdf(fn, width = width, height = height, onefile=FALSE)# ...) assign(".pdfaCrop.name", fn, envir = globalenv()) } ## This is used automagically : pdfaCrop.off <- function() { dev.off()# for the pdf f <- get(".pdfaCrop.name", envir = globalenv()) ## and now crop that file: pdfcrop <- "pdfcrop" # relying on PATH - fix if needed pdftex <- "pdftex" # relying on PATH - fix if needed system(paste(pdfcrop, "--pdftexcmd", pdftex, f, f, "1>/dev/null 2>&1"), intern=FALSE) } op.orig <- options(width = 75, SweaveHooks= list(fig=function() par(mar=c(5.1, 4.1, 1.1, 2.1))), digits = 5, useFancyQuotes = "TeX", ## for JSS, but otherwise MM does not like it: ## prompt="R> ", continue=" ")# 2 (or 3) blanks: use same length as 'prompt' if((p <- "package:fortunes") %in% search()) try(detach(p, unload=TRUE, char=TRUE)) Sys.setenv(LANGUAGE = "en") if(.Platform$OS.type != "windows") Sys.setlocale("LC_MESSAGES","C") if(getRversion() < "2.15") paste0 <- function(...) paste(..., sep = '') library("sfsmisc")# e.g., for eaxis() library("Rmpfr") .plot.BC <- FALSE # no Box-Cox plot @ %\section[Introduction]{Introduction \small~\footnote{\mythanks}} \section{Introduction: Not log() nor exp(), but log1p() and expm1()} In applied mathematics, it has been known for a very long time that direct computation of $\log(1 + x)$ suffers from severe cancellation (in ``$1 + x$'') whenever $\abs{x} \ll 1$, and for that reason, we have provided \code{log1p(x)} in \R{}, since R version 1.0.0 (released, Feb.~29, 2000). Similarly, \code{log1p()} has been provided by C math libraries and has become part of C language standards around the same time, see, for example, \citet{ieee04:log1p}. Analogously, since \R{}~1.5.0 (April 2002), the function \code{expm1(x)} computes $\exp(x) - 1 = e^x - 1$ accurately also for $\abs{x} \ll 1$, where $e^x \approx 1$ is (partially) cancelled by ``$-\: 1$''. In both cases, a simple solution %approach for small $\abs{x}$ is to use a few terms of the Taylor series, as \begin{align} \label{eq:Taylor-log1p} \loglp(x) &= \log(1 + x) = x - x^2/2 + x^3/3 -+ \dots, \ \mathrm{for}\ \ \abs{x} < 1, %\mathrm{and} \\ \label{eq:Taylor-expm1} \expml(x) &= \exp(x) - 1 = x + x^2/2! + x^3/3! + \dots, \ \mathrm{for}\ \ \abs{x} < 1, \end{align} and $n!$ denotes the factorial. We have found, however, that in some situations, the use of \code{log1p()} and \code{expm1()} may not be sufficient to prevent loss of numerical accuracy. The topic of this note is to analyze the important case of computing $\log\left(1 - e^x \right) = \log(1 - \exp(x))$ for $x < 0$, computations needed in accurate computations of the beta, gamma, exponential, Weibull, t, logistic, geometric and hypergeometric distributions, %% in ~/R/D/r-devel/R/src/nmath/ : %% grep --color -nHEw -e '(R_Log1_Exp|R_D_LExp|R_DT_Log|R_DT_C?log)' *.? %% --> ~/R/Pkgs/Rmpfr/vignettes/log1mexp_grep and % because of the latter, even for the logit link function in logistic regression. For the beta and gamma distributions, see, for example, % e.g., \citet{DidAM92}\footnote{In the Fortran source, file ``\code{708}'', also available as \url{http://www.netlib.org/toms/708}, the function ALNREL() computes log1p() and REXP() computes expm1().}, and further references mentioned in \R{}'s \code{?pgamma} and \code{?pbeta} help pages. For the logistic distribution, $F_L(x) = \frac{e^x}{1+e^x}$, the inverse, aka quantile function is $q_L(p) = \mathrm{logit}(p) := \log \frac{p}{1-p}$. If the argument $p$ is provided on the log scale, $\tilde p := \log p$, hence $\tilde p \le 0$, we need \begin{align} \label{eq:qlogis} \mathtt{qlogis}(\tilde p,\: \mathtt{log.p=TRUE}) = q_L\!\left(e^{\tilde p}\right) = \mathrm{logit}\!\left(e^{\tilde p}\right) % = \log\Bigl(\frac{e^{\tilde p}}{1-e^{\tilde p}}\Bigr) = \log \frac{e^{\tilde p}}{1-e^{\tilde p}} = \tilde p - \log\left(1 - e^{\tilde p} \right), \end{align} and the last term is exactly the topic of this note. \section{log1p() and expm1() for log(1 - exp(x))} Contrary to what one would expect, for computing $\log\left(1 - e^x \right) = \log(1 - \exp(x))$ for $x < 0$, neither \begin{align} \label{eq:f.expm1} \log(1 - \exp(x)) &= \log(-\expml(x)), \ \ \mathrm{nor}\\ \label{eq:f.log1p} \log(1 - \exp(x)) &= \loglp(-\exp(x)), \end{align} are uniformly sufficient for numerical evaluation. %% 1 In (\ref{eq:f.log1p}), when $x$ approaches $0$, $\exp(x)$ approaches $1$ and $\loglp(-\exp(x))$ loses accuracy. %% 2 In (\ref{eq:f.expm1}), when $x$ is large, $\expml(x)$ approaches $-1$ and similarly loses accuracy. Because of this, we will propose to use a function \code{log1mexp(x)} which uses either \code{expm1} (\ref{eq:f.expm1}) or \code{log1p} (\ref{eq:f.log1p}), where appropriate. Already in \R{}~1.9.0 (\cite{R-190}), % (April 2004) % now, both R_Log1_Exp() and --> R_D_LExp(x) := (log_p ? R_Log1_Exp(x) : log1p(-x)) we have defined the macro \verb|R_D_LExp(x)| to provide these two cases %branches automatically\footnote{look for ``log(1-exp(x))'' in \url{http://svn.r-project.org/R/branches/R-1-9-patches/src/nmath/dpq.h}}. % R-1.8.1: pgamma(30,100, lower=FALSE, log=TRUE) gave 0 instead of -... To investigate the accuracy losses empirically, we make use of the \R{} package \CRANpkg{Rmpfr} for arbitrarily accurate numerical computation, and use the following simple functions: <>= library(Rmpfr) t3.l1e <- function(a) { c(def = log(1 - exp(-a)), expm1 = log( -expm1(-a)), log1p = log1p(-exp(-a))) } @ <>= leg <- local({ r <- body(t3.l1e)[[2]]; r[[1]] <- `expression`; eval(r) }) ## will be used below @ <>= ##' The relative Error of log1mexp computations: relE.l1e <- function(a, precBits = 1024) { stopifnot(is.numeric(a), length(a) == 1, precBits > 50) da <- t3.l1e(a) ## double precision a. <- mpfr(a, precBits=precBits) ## high precision *and* using the correct case: mMa <- if(a <= log(2)) log(-expm1(-a.)) else log1p(-exp(-a.)) structure(as.numeric(1 - da/mMa), names = names(da)) } @ <>= <> <> @ where the last one, \code{relE.l1e()} computes the relative error of three different ways to compute $\log(1 - \exp(-a))$ for positive $a$ (instead of computing $\log(1 - \exp(x))$ for negative $x$). %% TODO? "cache = TRUE": --- <>= a.s <- 2^seq(-55, 10, length = 256) ra.s <- t(sapply(a.s, relE.l1e)) <>= <> cbind(a.s, ra.s) # comparison of the three approaches <>= <> capture.and.write(cbind(a.s, ra.s), 8, last = 6) @ This is revealing: Neither method, log1p or expm1, is uniformly good enough. Note that for large $a$, the relative errors evaluate to \code{1}. This is because all three double precision methods give 0, \emph{and} that is the best approximation in double precision (but not in higher \code{mpfr} precision), hence no problem at all, and we can restrict ourselves to smaller $a$ (smaller than about 710, here).% < 709.78271289338403 (lynne 64b) <>= ii <- a.s < 710 a.s <- a.s[ii] ra.s <- ra.s[ii, ] @ What about really small $a$'s? Note here that <>= t3.l1e(1e-20) as.numeric(t3.l1e(mpfr(1e-20, 256))) @ % ## expm1 def log1p % ## -46.0517 -Inf -Inf % as.numeric(): % ## [1] -46.0517 -46.0517 -46.0517 both the default and the \code{log1p} method return \code{-Inf}, so, indeed, the \code{expm1} method is absolutely needed here. Figure~\ref{fig:bigpic} visualizes the relative errors\footnote{% Absolute value of relative errors, $\abs{(\hat{f}(a) - f(a)) / f(a)} = \abs{1 - \hat{f}(a)/f(a)}$, where $f(a) = \mathrm{log1mexp}(a)$ (\ref{eq:log1mexp}) is computed accurately by a 1024 bit \pkg{Rmpfr} computation} of the three methods. Note that the default basically gives the maximum of the two methods' errors, whereas the final \code{log1mexp()} function will have (approximately) minimal error of the two. %% --- Define figure_1 here ------------------------------ <>= par(mar = c(4.1,4.1,0.6,1.6)) cc <- adjustcolor(c(4,1,2),.8, red.f=.7) lt <- c("solid","33","3262") ll <- c(.7, 1.5, 2) @ %% main = "|relative errors| of three methods for log(1 - exp(-a))" <>= matplot(a.s, abs(ra.s), type = "l", log = "xy", col=cc, lty=lt, lwd=ll, xlab = "a", ylab = "", axes=FALSE) legend("top", leg, col=cc, lty=lt, lwd=ll, bty="n") draw.machEps <- function(alpha.f = 1/3, col = adjustcolor("black", alpha.f)) { abline(h = .Machine$double.eps, col=col, lty=3) axis(4, at=.Machine$double.eps, label=quote(epsilon[c]), las=1, col.axis=col) } eaxis(1); eaxis(2); draw.machEps(0.4) @ %% TODO? "cache = TRUE": echo=FALSE: do not show already, but need (a.,ra2) <>= a. <- (1:400)/256 ra <- t(sapply(a., relE.l1e)) ra2 <- ra[,-1] @ \begin{figure}[htb!] \centering % increasing width --> effective LaTeX *height* will decrease <>= <> <> ## draw the zoom-in region into the plot: yl <- range(pmax(1e-18, abs(ra2))) rect(min(a.), yl[1], max(a.), yl[2], col= adjustcolor("black", .05), border="gray", pch = 5) @ \setcapwidth{\textwidth}% \caption[Relative errors of log1mexp() approximations]{% Relative errors$^{*}$ of the default, $\log(1 - e^{-a})$, and the two methods ``\code{expm1}'' $\log(-\expml(-a))$ and ``\code{log1p}'' $\loglp(-\exp(-a))$. Figure~\ref{fig:zoomin-pic} will be a zoom into the gray rectangular region where all three curves are close.} \label{fig:bigpic} \end{figure} In Figure~\ref{fig:zoomin-pic} below, we zoom into the region where all methods have about the same (good) accuracy. The region is the rectangle defined by the ranges of \code{a.} and \code{ra2}: <>= <> @ In addition to zooming in Figure~\ref{fig:bigpic}, we want to smooth the two curves, using a method assuming approximately normal errors. Notice however that neither the original, nor the log-transformed values have approximately symmetric errors, so we use \code{MASS::boxcox()} to determine the ``correct'' power transformation, <>= da <- cbind(a = a., as.data.frame(ra2)) library(MASS) bc1 <- boxcox(abs(expm1) ~ a, data = da, lambda = seq(0,1, by=.01), plotit=.plot.BC) bc2 <- boxcox(abs(log1p) ~ a, data = da, lambda = seq(0,1, by=.01), plotit=.plot.BC) c(with(bc1, x[which.max(y)]), with(bc2, x[which.max(y)]))## optimal powers ## ==> taking ^ (1/3) : s1 <- with(da, smooth.spline(a, abs(expm1)^(1/3), df = 9)) s2 <- with(da, smooth.spline(a, abs(log1p)^(1/3), df = 9)) @ i.e, the optimal boxcox exponent turns out to be close to $\frac 1 3$, which we use for smoothing in a ``zoom--in'' of Figure~\ref{fig:bigpic}. Then, the crossover point of the two curves already suggests that the cutoff, $a_0 = \log 2$ is empirically very close to optimal. <>= matplot(a., abs(ra2), type = "l", log = "y", # ylim = c(-1,1)*1e-12, col=cc[-1], lwd=ll[-1], lty=lt[-1], ylim = yl, xlab = "a", ylab = "", axes=FALSE) legend("topright", leg[-1], col=cc[-1], lwd=ll[-1], lty=lt[-1], bty="n") eaxis(1); eaxis(2); draw.machEps() lines(a., predict(s1)$y ^ 3, col=cc[2], lwd=2) lines(a., predict(s2)$y ^ 3, col=cc[3], lwd=2) @ %% no title here: main = "|relative errors| of two methods for log(1 - exp(-a))") \enlargethispage{5ex} \begin{figure}[hbt!] \centering <>= cl2 <- adjustcolor("slateblue", 1/2)# (adj: lwd=3) # the color for "log(2)" par(mar = c(4.1,4.1,0.6,1.6)) <> abline(v = log(2), col=cl2, lty="9273", lwd=2.5) cl2. <- adjustcolor(cl2, 2) axis(1, at=log(2), label=quote(a[0] == log~2), las=1, col.axis=cl2.,col=cl2, lty="9273", lwd=2.5) ## what system is it ? sysInf <- Sys.info()[c("sysname", "release", "nodename", "machine")] mtext(with(as.list(sysInf), paste0(sysname," ",release,"(",substr(nodename,1,16),") -- ", machine)), side=1, adj=1, line=2.25, cex = 3/4) @ \setcapwidth{\textwidth}% \caption{A ``zoom in'' of Figure~\ref{fig:bigpic} showing the region where the two basic methods, ``\code{expm1}'' and ``\code{log1p}'' switch their optimality with respect to their relative errors. Both have small relative errors in this region, typically below $\eps_c :=$% \code{.Machine\$double.eps} $=2^{-52} \approx 2.22\cdot 10^{-16}$. \ \ The smoothed curves indicate crossover close to $a = a_0 := \log 2$.} \label{fig:zoomin-pic} \end{figure} \paragraph{Why is it very plausible to take $a_0 := \log 2$ as approximately optimal cutoff?} Already from Figure~\ref{fig:zoomin-pic}, empirically, an optimal cutoff $a_0$ is around $0.7$. We propose to compute \begin{align} \label{eq:def-log1mexp} f(a) = \log\left(1 - e^{-a}\right) = \log(1 - \exp(-a)), \ \ a > 0, \end{align} by a new method or function \code{log1mexp(a)}. It needs a cutoff $a_0$ between choosing \code{expm1} for $0 < a \le a_0$ and \code{log1p} for $a > a_0$, i.e., \begin{align} \label{eq:log1mexp} f(a) = \mathrm{log1mexp}(a) := \begin{cases} \log(-\expml(-a)) & 0 < a \le a_0 \ \ ( := \log 2 \approx 0.693) \\ \loglp(-\exp(-a)) & \phantom{0 < {}}a > a_0. \end{cases} \end{align} The mathematical argument for choosing $a_0$ is quite simple, at least informally: In which situations does $1 - e^{-a}$ loose bits (binary digits) \emph{entirely independently} of the computational algorithm? Well, as soon as it ``spends'' bits just to store its closeness to $1$. And that is as soon as $e^{-a} < \frac 1 2 = 2^{-1}$, because then, at least one bit cancels. This however is equivalent to $-a < \log(2^{-1}) = -\log(2)$ or $a > \log 2 =: a_0$. \section{Computation of log(1+exp(x))} Related to $\mathrm{log1mexp}(a)=\log(1 - e^{-a})$ is the log survival function of the logistic distribution % (see above)%: defined F_L $\log(1 - F_L(x)) = \log\frac{1}{1+e^x} = -\log(1 + e^x) = -g(x)$, where \begin{align} \label{eq:def-log1pexp} g(x) := \log(1 + e^x) = \loglp(e^x), \end{align} which has a ``$+"$'' instead of a ``$-$'', compared to $\mathrm{log1mexp}$, and is easier to analyze and compute, its only problem being large $x$'s where $e^x$ % = \exp x$ overflows numerically.\footnote{Indeed, for $x=710$, $ -g(x) = \log(1 - F_L(x)) = $ \code{plogis(710, lower=FALSE, log.p=TRUE)}, underflowed to \code{-Inf} in \R{} versions before 2.15.1 (June 2012) from when on (\ref{eq:log1pexp}) has been used.} As $g(x)= \log(1 + e^x) = \log(e^x(e^{-x} + 1)) = x + \log(1 + e^{-x})$, we see from (\ref{eq:Taylor-log1p}) that \begin{align} \label{eq:log1pexp-asym} g(x) = x + \log(1 + e^{-x}) = % \sim %\asymp %% x + e^{-x}(1 - e^{-x}/2) + \O((e^{-x})^3), x + e^{-x} + \O((e^{-x})^2), \end{align} for $x\to\infty$. Note further, that for $x\to-\infty$, we can simplify $g(x)=\log(1 + e^x)$ to $e^x$. A simple picture quickly reveals how different approximations behave, where we have used \code{uniroot()} to determine the zero crossing, but will use slightly simpler cutoffs $x_0=37$, $x_1$ and $x_2$, in (\ref{eq:log1pexp}) below: %% Notation x_0, x_1, x_2 are related to the 1st, 2nd and 3rd cutoff in equation (10) %% -37 18 33.3 <>= ## Find x0, such that exp(x) =.= g(x) for x < x0 : f0 <- function(x) { x <- exp(x) - log1p(exp(x)) x[x==0] <- -1 ; x } u0 <- uniroot(f0, c(-100, 0), tol=1e-13) str(u0, digits=10) x0 <- u0[["root"]] ## -36.39022698 --- note that ~= \log(\eps_C) all.equal(x0, -52.5 * log(2), tol=1e-13) ## Find x1, such that x + exp(-x) =.= g(x) for x > x1 : f1 <- function(x) { x <- (x + exp(-x)) - log1p(exp(x)) x[x==0] <- -1 ; x } u1 <- uniroot(f1, c(1, 20), tol=1e-13) str(u1, digits=10) x1 <- u1[["root"]] ## 16.408226 ## Find x2, such that x =.= g(x) for x > x2 : f2 <- function(x) { x <- log1p(exp(x)) - x ; x[x==0] <- -1 ; x } u2 <- uniroot(f2, c(5, 50), tol=1e-13) str(u2, digits=10) x2 <- u2[["root"]] ## 33.27835 @ %% but really the above is still ``non sense'': look at <>= par(mfcol= 1:2, mar = c(4.1,4.1,0.6,1.6), mgp = c(1.6, 0.75, 0)) curve(x+exp(-x) - log1p(exp(x)), 15, 25, n=2^11); abline(v=x1, lty=3) curve(log1p(exp(x)) - x, 33.1, 33.5, n=2^10); abline(v=x2, lty=3) @ \medskip Using double precision arithmetic, a fast and accurate computational method is to use \begin{align} \label{eq:log1pexp} \hat{g}(x) = \mathrm{log1pexp}(x) := \begin{cases} \exp(x) & x \le -37 \\ \loglp(\exp(x)) & -37 < x \le x_1 := 18, \\ x + \exp(-x) & x_1 < x \le x_2 := 33.3, \\ x & x > x_2, \end{cases} \end{align} where only the cutoff $x_1 = 18$ is important and the other cutoffs just save computations.\footnote{see % the %\R{} plot \code{curve(log1p(exp(x)) - x, 33.1, 33.5, n=2\^{}10)} above, revealing a somewhat fuzzy cutoff $x_2$.} %%--- Ok, still do a little deeper analysis for the interested R code reader %%--- invisibly mostly (echo=FALSE) here: <>= t4p.l1e <- function(x) { c(def = log(1 + exp(x)), log1p = log1p(exp(x)), ## xlog1p = x + log1p(exp(-x)), xpexp = x + exp(-x), x = x) } leg <- local({ r <- body(t4p.l1e)[[2]]; r[[1]] <- `expression`; eval(r) }) ##' The relative Error of log1pexp computations: relE.pl1e <- function(x, precBits = 1024) { stopifnot(is.numeric(x), length(x) == 1, precBits > 50) dx <- t4p.l1e(x) ## double precision x. <- mpfr(x, precBits=precBits) ## high precision *and* using the correct case: mMx <- if(x < 0) log1p(exp(x.)) else x. + log1p(exp(-x.)) structure(as.numeric(1 - dx/mMx), names = names(dx)) } <>= x.s <- seq(-100, 750, by = 5) # <- the big picture ==> problem for default x.s <- seq( 5, 60, length=512) # <- the zoom in ==> *no* problem for def. rx.s <- t(sapply(x.s, relE.pl1e)) signif(cbind(x.s, rx.s),3) @ \begin{figure}[htb!] \centering %% using "blue" for the default method, *as* in Figure 1 above <>= par(mar = c(4.1,4.1,0.6,1.6), mgp = c(1.6, 0.75, 0)) cc <- adjustcolor(c(4,1,2,3),.8, red.f=.7, blue.f=.8) lt <- c("solid","33","3262","dotdash") ll <- c(.7, 1.5, 2, 2) ym <- 1e-18 yM <- 1e-13 matplot(x.s, pmax(pmin(abs(rx.s),yM),ym), type = "l", log = "y", axes=FALSE, ylim = c(ym,yM), col=cc, lty=lt, lwd=ll, xlab = "x", ylab = "") legend("topright", leg, col=cc, lty=lt, lwd=ll, bty="n") eaxis(1, at=pretty(range(x.s), n =12)); eaxis(2) draw.machEps(0.4) x12 <- c(18, 33.3) abline(v=x12, col=(ct <- adjustcolor("brown", 0.6)), lty=3) axis(1, at=x12, labels=formatC(x12), padj = -3.2, hadj = -.1, tcl = +.8, col=ct, col.axis=ct, col.ticks=ct) @ % increasing width --> effective LaTeX *height* will decrease \setcapwidth{\textwidth}% \caption{Relative errors (via \pkg{Rmpfr}, see footnote of Fig.~\ref{fig:bigpic}) of four different ways to numerically compute $\log\bigl(1 + e^{x}\bigr)$. Vertical bars at $x_1 = 18$ and $x_2 = 33.3$ visualize the (2nd and 3rd) cutpoints of (\ref{eq:log1pexp}).} % Moved into text:|| down Note that the default method is fully accurate on this $x$ range. \label{fig:log1pexp} \end{figure} Figure~\ref{fig:log1pexp} visualizes the relative errors of the careless ``default'', $\log\bigl(1 + e^{x}\bigr)$, its straightforward correction $\loglp\bigl(e^x\bigr)$, the intermediate approximation $x + e^{-x}$, and the large $x$ ($ = x$), i.e., the methods in (\ref{eq:log1pexp}), depicting that the (easy to remember) cutoffs $x_1$ and $x_2$ in (\ref{eq:log1pexp}) are valid. %% moved from figure caption: Note that the default method is fully accurate on this $x$ range and only problematic when $e^x$ begins to overflow, i.e., $x > e_{\mathrm{Max}}$, which is <>= (eMax <- .Machine$double.max.exp * log(2)) exp(eMax * c(1, 1+1e-15)) @ where we see that indeed $e_{\mathrm{Max}} = $\code{eMax} is the maximal exponent without overflow. \section{Conclusion} We have used high precision arithmetic (\R{} package \pkg{Rmpfr}) to empirically verify that computing $f(a) = \log\left(1 - e^{-a}\right)$ is accomplished best via equation (\ref{eq:log1mexp}). In passing, we have also shown that accurate computation of $g(x) = \log(1+e^x)$ can be achieved via (\ref{eq:log1pexp}). % Note that %% FIXME: %% a short version of this note has been published .... %% \cite{....} a version of this note is available as vignette (in \texttt{Sweave}, i.e., with complete \R{} source) from the \pkg{Rmpfr} package vignettes. \subsection*{Session Information} \nopagebreak <>= toLatex(sessionInfo(), locale=FALSE) <>= options(op.orig) @ %\clearpage \bibliography{log1mexp} \end{document} Rmpfr/vignettes/Maechler_useR_2011-abstr.Rnw0000644000175000017500000001227112174274363020500 0ustar nileshnilesh\documentclass[11pt, a4paper]{article} \usepackage{amsfonts, amsmath, hanging, hyperref, natbib, parskip, times} \usepackage[pdftex]{graphicx} \hypersetup{ colorlinks, linkcolor=blue, urlcolor=blue } \SweaveOpts{eps=FALSE,pdf=TRUE,width=7,height=4,strip.white=true,keep.source=TRUE} %\VignetteIndexEntry{useR-2011-abstract} %\VignetteDepends{Rmpfr} <>= options(SweaveHooks= list(fig=function() par(mar=c(5.1, 4.1, 1.1, 2.1))), width = 75) Sys.setenv(LANGUAGE = "en") if(.Platform$OS.type != "windows") Sys.setlocale("LC_MESSAGES","C") stopifnot(require("Rmpfr")) @ \let\section=\subsubsection \newcommand{\pkg}[1]{{\normalfont\fontseries{b}\selectfont #1}} \let\proglang=\textit \let\code=\texttt \renewcommand{\title}[1]{\begin{center}{\bf \LARGE #1}\end{center}} \newcommand{\affiliations}{\footnotesize} \newcommand{\keywords}{\paragraph{Keywords:}} \setlength{\topmargin}{-15mm} \setlength{\oddsidemargin}{-2mm} \setlength{\textwidth}{165mm} \setlength{\textheight}{250mm} \usepackage{Sweave} \DefineVerbatimEnvironment{Sinput}{Verbatim}{fontsize=\small,fontshape=sl} \DefineVerbatimEnvironment{Soutput}{Verbatim}{fontsize=\small} \DefineVerbatimEnvironment{Scode}{Verbatim}{fontsize=\small,fontshape=sl} % but when submitting, do get rid of too much vertical space between R % input & output, i.e. between Sinput and Soutput: \fvset{listparameters={\setlength{\topsep}{0pt}}}% !! quite an effect! %% % \newcommand*{\R}{\proglang{R}}%{\textsf{R}} \begin{document} \pagestyle{empty} \vspace*{-15ex} \begin{flushleft}\footnotesize Corrected abstract for ``late-breaking poster'' and ``Lightning talk'' to be held at ``UseR! 2011'', U.~Warwick, 16th Aug.~2011%, 17:00--18:00 \\[-1ex]\noindent\rule{\textwidth}{0.5pt}\\ % horizontal line \end{flushleft} \vspace*{+9ex} \title{Arbitrarily Accurate Computation with R: Package 'Rmpfr'} \begin{center} {\bf Martin M\"achler$^{1,2,^\star}$} \end{center} \begin{affiliations} 1. ETH Zurich (Seminar for Statistics), Switzerland \\[-2pt] 2. R Core Development Team \\[-2pt] $^\star$Contact author: \href{mailto:maechler@stat.math.ethz.ch}{maechler@stat.math.ethz.ch} \end{affiliations} \keywords Arbitrary Precision, High Accuracy, Multiple Precision Floating-Point, Rmpfr \vskip 0.8cm % Some suggestions: if you mention a programming language like % \proglang{R}, typeset the language name with the {\tt \textbackslash % proglang\{\}} command. If you mention an \proglang{R} function \code{foo}, % typeset the function name with the with the {\tt\textbackslash code\{\}} % command. If you mention an \proglang{R} package \pkg{fooPkg}, typeset % the package name with the {\tt\textbackslash pkg\{\}} command. % Abstracts should not exceed one page. The page should not be numbered. The \proglang{R}\ package \pkg{Rmpfr} allows to use arbitrarily precise numbers instead of \proglang{R}'s double precision numbers in many \proglang{R}\ computations and functions. This is achieved by defining S4 classes of such numbers and vectors, matrices, and arrays thereof, where all arithmetic and mathematical functions work via the (GNU) MPFR C library, where MPFR is acronym for ``\emph{\textbf{M}ultiple \textbf{P}recision \textbf{F}loating-Point \textbf{R}eliably}''\nocite{FousseHLPZ:2007}. MPFR is Free Software, available under the LGPL license\nocite{FousseHLPZ-MPFR:2011}, and itself is built on the free GNU Multiple Precision arithmetic library (GMP)\nocite{GMP:2011}. Consequently, by using \pkg{Rmpfr}, you can often call your \proglang{R}\ function or numerical code with mpfr--numbers instead of simple numbers, and all results will automatically be much more accurate. <>= options(digits = 17)# to print to full "standard R" precision .N <- function(.) mpfr(., precBits = 200) exp( 1 ) exp(.N(1)) <>= choose ( 200, 99:100 ) chooseMpfr( 200, 99:100 ) @ %% Applications by the package author include testing of Bessel or polylog functions and distribution computations, e.g. for stable distributions. %% In addition, the \pkg{Rmpfr} has been used on the \code{R-help} or \code{R-devel} mailing list for high-accuracy computations, e.g., in comparison with results from commercial software such as Maple, and in private communications with Petr Savicky about fixing \proglang{R} bug \href{https://bugs.R-project.org/bugzilla3/show_bug.cgi?id=14491}{\code{PR\#14491}}. We expect the package to be used in more situations for easy comparison studies about the accuracy of algorithms implemented in \proglang{R}, both for ``standard \proglang{R}'' and extension packages. %% references: \nocite{% MM-Rmpfr_pkg} %\bibliographystyle{chicago}%% how on earth do I get the URLs ??/ \bibliographystyle{jss}%% how on earth do I get the URLs ??/ \bibliography{Rmpfr} %% references can alternatively be entered by hand %\subsubsection*{References} %\begin{hangparas}{.25in}{1} %AuthorA (2007). Title of a web resource, \url{http://url/of/resource/}. %AuthorC (2008a). Article example in proceedings. In \textit{useR! 2008, The R %User Conference, (Dortmund, Germany)}, pp. 31--37. %AuthorC (2008b). Title of an article. \textit{Journal name 6}, 13--17. %\end{hangparas} \end{document} Rmpfr/vignettes/Rmpfr-pkg.Rnw0000644000175000017500000005751713522366777016100 0ustar nileshnilesh%\documentclass[article]{jss} \documentclass[nojss,article]{jss} % ----- for the package-vignette, don't use JSS logo, etc % %__FIXME: use ..\index{} for a good "reference index" about the things we show! % \author{Martin M\"achler \\ ETH Zurich} \title{Arbitrarily Accurate Computation with \R: \\ The \pkg{Rmpfr} Package} % \def\mythanks{a version of this paper, for \pkg{nacopula} 0.4\_4, has been published % in JSS, \url{http://www.jstatsoft.org/v39/i09}.} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Martin M\"achler} %% comma-separated \Plaintitle{Arbitrarily Accurate Computation with R---The Rmpfr Package} % \Shorttitle{} % % The index entry makes it into build/vignette.rds : %\VignetteIndexEntry{Arbitrarily Accurate Computation with R Package Rmpfr} %\VignetteDepends{Rmpfr} %\VignetteDepends{gmp} %\VignetteDepends{Bessel} \SweaveOpts{engine=R,eps=FALSE,pdf=TRUE,width=7,height=4,strip.white=true,keep.source=TRUE} %% an abstract and keywords \Abstract{ The \R\ package \pkg{Rmpfr} allows to use arbitrarily precise numbers instead of \R's double precision numbers in many \R\ computations and functions. %% This is achieved by defining S4 classes of such numbers and vectors, matrices, and arrays thereof, where all arithmetic and mathematical functions work via the (GNU) MPFR C library, where MPFR is acronym for ``\emph{\textbf{M}ultiple \textbf{P}recision \textbf{F}loating-Point \textbf{R}eliably}''. MPFR is Free Software, available under the LGPL license, and itself is built on the free GNU Multiple Precision arithmetic library (GMP). Consequently, by using \pkg{Rmpfr}, you can often call your \R\ function or numerical code with mpfr--numbers instead of simple numbers, and all results will automatically be much more accurate. %% see subsection{Applications} further below: Applications by the package author include testing of Bessel or polylog functions and distribution computations, e.g. for ($\alpha$-)stable distributions and Archimedean Copulas. %% In addition, the \pkg{Rmpfr} has been used on the \code{R-help} or \code{R-devel} mailing list for high-accuracy computations, e.g., in comparison with results from other software, and also in improving existing \R\ functionality, e.g., fixing \R\ bug \href{https://bugs.R-project.org/bugzilla3/show_bug.cgi?id=14491}{\code{PR\#14491}}. } \Keywords{MPFR, Abitrary Precision, Multiple Precision Floating-Point, R} %% at least one keyword must be supplied %% publication information %% NOTE: Typically, this can be left commented and will be filled out by the technical editor %% \Volume{13} %% \Issue{9} %% \Month{September} %% \Year{2004} %% \Submitdate{2004-09-29} %% \Acceptdate{2004-09-29} %% The address of (at least) one author should be given %% in the following format: \Address{ Martin M\"achler\\ Seminar f\"ur Statistik, HG G~16\\ ETH Zurich\\ 8092 Zurich, Switzerland\\ E-mail: \email{maechler@stat.math.ethz.ch}\\ URL: \url{http://stat.ethz.ch/people/maechler} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/1/31336-5053 %% Fax: +43/1/31336-734 %% for those who use Sweave please include the following line (with % symbols): %% MM: this is "substituted" by jss.cls: %% need no \usepackage{Sweave.sty} %% Marius' packages \usepackage[american]{babel}%for American English % \usepackage{microtype}%for character protrusion and font expansion (only with pdflatex) \usepackage{amsmath}%sophisticated mathematical formulas with amstex (includes \text{}) \usepackage{mathtools}%fix amsmath deficiencies \usepackage{amssymb}%sophisticated mathematical symbols with amstex (includes \mathbb{}) % \usepackage{amsthm}%theorem environments % \usepackage{bm}%for bold math symbols: \bm (= bold math) % %NON-STANDARD:\RequirePackage{bbm}%only for indicator functions % \usepackage{enumitem}%for automatic numbering of new enumerate environments % \usepackage[ % format=hang, % % NOT for JSS: labelsep=space, % justification=justified, % singlelinecheck=false%, % % NOT for JSS: labelfont=bf % ]{caption}%for captions % \usepackage{tikz}%sophisticated graphics package % \usepackage{tabularx}%for special table environment (tabularx-table) % \usepackage{booktabs}%for table layout % This is already in jss above -- but withOUT the fontsize=\small part !! \DefineVerbatimEnvironment{Sinput}{Verbatim}{fontsize=\small,fontshape=sl} \DefineVerbatimEnvironment{Soutput}{Verbatim}{fontsize=\small} \DefineVerbatimEnvironment{Scode}{Verbatim}{fontsize=\small,fontshape=sl} % but when submitting, do get rid of too much vertical space between R % input & output, i.e. between Sinput and Soutput: \fvset{listparameters={\setlength{\topsep}{0pt}}}% !! quite an effect! %% % \newcommand*{\R}{\proglang{R}}%{\textsf{R}} \newcommand*{\Arg}[1]{\texttt{\itshape $\langle$#1$\rangle$}} \newcommand*{\eps}{\varepsilon} \newcommand*{\CRANpkg}[1]{\href{http://CRAN.R-project.org/package=#1}{\pkg{#1}}} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %% include your article here, just as usual %% Note that you should use the \pkg{}, \proglang{} and \code{} commands. % \section[About Java]{About \proglang{Java}} %% Note: If there is markup in \(sub)section, then it has to be escape as above. %% Note: These are explained in '?RweaveLatex' : <>= options(SweaveHooks= list(fig=function() par(mar=c(5.1, 4.1, 1.1, 2.1))), width = 75, digits = 7, # <-- here, keep R's default! prompt = "R> ", continue=" ") Sys.setenv(LANGUAGE = "en") if(.Platform$OS.type != "windows") Sys.setlocale("LC_MESSAGES","C") <>= if(nzchar(Sys.getenv("R_MM_PKG_CHECKING"))) print( .libPaths() ) stopifnot(require("sfsmisc")) @ \section[Introduction]{Introduction}% \small~\footnote{\mythanks}} %% - Why did I want this in R : There are situations, notably in researching better numerical algorithms for non-trivial mathematical functions, say the $F$-distribution function, where it is interesting and very useful to be able to rerun computations in \R\ in (potentially much) higher precision. For example, if you are interested in Euler's $e$, the base of natural logarithms, and given, e.g., by $e^x = \exp(x)$, you will look into <>= exp(1) @ which typically uses 7 digits for printing, as \code{getOption("digits")} is 7. To see \R's internal accuracy fully, you can use <>= print(exp(1), digits = 17) @ With \pkg{Rmpfr} you can now simply use ``mpfr -- numbers'' and get more accurate results automatically, here using a \emph{vector} of numbers as is customary in \R: <>= require("Rmpfr") # after having installed the package ... (one <- mpfr(1, 120)) exp(one) @ In combinatorics, number theory or when computing series, you may occasionally want to work with \emph{exact} factorials or binomial coefficients, where e.g. you may need all factorials $k!$, for $k=1,2,\dots,24$ or a full row of Pascal's triangle, i.e., want all $\binom{n}{k}$ for $n=80$. With \R's double precision, and standard printing precision <>= ns <- 1:24 ; factorial(ns) @ the full precision of $24!$ is clearly not printed. However, if you display it with more than its full internal precision, <>= noquote(sprintf("%-30.0f", factorial(24))) @ it is obviously wrong in the last couple of digits as they are known to be \code{0}. However, you can easily get full precision results with \pkg{Rmpfr}, by replacing ``simple'' numbers by mpfr-numbers: <>= ns <- mpfr(1:24, 120) ; factorial(ns) @ Or for the 80-th Pascal triangle row, $\binom{n}{k}$ for $n=80$ and $k=1,\dots,n$, <>= chooseMpfr.all(n = 80) <>= capture.and.write(# <- in package 'sfsmisc': ~/R/Pkgs/sfsmisc/R/misc-goodies.R <> , 5, 2, middle = 4, i.middle = 13) @ %%% "FIXME:" drawback of the above is that it is *integer* arithmetic only ... \paragraph{S4 classes and methods:} % Why they are useful here: S4 allows ``multiple dispatch'' which means that the method that is called for a generic function may not just depend on the first argument of the function (as in S3 or in traditional class-based OOP), but on a \emph{``signature''} of multiple arguments. For example, \texttt{a + b} is the same as \code{`+`(a,b)}, i.e., calling a function with two arguments. ... \subsection{The engine behind: MPFR and GMP} The package \pkg{Rmpfr} interfaces \R\ to the C (GNU) library \begin{quote} MPFR, acronym for ``\emph{\textbf{M}ultiple \textbf{P}recision \textbf{F}loating-Point \textbf{R}eliably}'' \end{quote} MPFR is Free Software, available under the LGPL license, %\nocite{ see \url{http://mpfr.org/} and \cite{FouLHLPZ:2007} and the standard reference to MPFR, \cite{FousseHLPZ-MPFR:2011}. %% MPFR itself is built on and requires the GNU Multiple Precision arithmetic library (GMP), see \url{http://gmplib.org/} and \cite{GMP:2011}. It can be obtained from there, or from your operating system vendor. On some platforms, it is very simple, to install MPFR and GMP, something necessary before \pkg{Rmpfr} can be used. E.g., in Linux distributions Debian, Ubuntu and other Debian derivatives, it is sufficient (for \emph{both} libraries) to simply issue \begin{verbatim} sudo apt-get install libmpfr-dev \end{verbatim} \section{Arithmetic with mpfr-numbers} <>= (0:7) / 7 # k/7, for k= 0..7 printed with R's default precision options(digits= 16) (0:7) / 7 # in full double precision accuracy options(digits= 7) # back to default str(.Machine[c("double.digits","double.eps", "double.neg.eps")], digits=10) 2^-(52:53) @ In other words, the double precision numbers \R\ uses have a 53-bit mantissa, and the two ``computer epsilons'' are $2^{-52}$ and $2^{-53}$, respectively. Less technically, how many decimal digits can double precision numbers work with, $2^{-53} = 10^{-x} \Longleftrightarrow x = 53 \log_{10}(2)$, <>= 53 * log10(2) @ i.e., almost 16 digits. If we want to compute some arithmetic expression with higher precision, this can now easily be achieved, using the \pkg{Rmpfr} package, by defining ``\texttt{mpfr}--numbers'' and then work with these. Starting with simple examples, a more precise version of $k/7$, $k = 0,\dots, 7$ from above: <>= x <- mpfr(0:7, 80)/7 # using 80 bits precision x 7*x 7*x - 0:7 @ which here is even ``perfect'' -- but that's ``luck'' only, and also the case here for ``simple'' double precision numbers, at least on our current platform.\footnote{64-bit Linux, Fedora 13 on a ``AMD Phenom 925'' processor} \subsection[Mathematical Constants, Pi, gamma, ..]{% Mathematical Constants, Pi ($\pi$), gamma, etc} Our \pkg{Rmpfr} package also provides the mathematical constants which MPFR provides, via \code{Const(., \Arg{prec})}, currently the \Sexpr{length(eval(formals(Const)[["name"]]))} constants <>= formals(Const)$name @ are available, where \code{"gamma"} is for Euler's gamma, $\gamma := \lim_{n\to\infty} \sum_{k=1}^n \frac 1 k - \log(n) \approx 0.5777$, and \code{"catalan"} for Catalan's constant (see \url{http://en.wikipedia.org/wiki/Catalan\%27s_constant}). <>= Const("pi") Const("log2") @ where you may note a default precision of 120 digits, a bit more than quadruple precision, but also that 1000 digits of $\pi$ are available instantaneously, <>= system.time(Pi <- Const("pi", 1000 *log2(10))) Pi @ As nice example of using Mpfr arithmetic: On a wintery Sunday, Hans Borchers desired to have an exact $\pi$ constant in \pkg{Rmpfr}, and realized that of course \code{mpfr(pi, 256)} could not be the solution, as \code{pi} is the double precision version of $\pi$ and hence only about 53 bit accurate (and the \code{mpfr()} cannot do magic, recognizing ``symbolic'' $\pi$). As he overlooked the \code{Const("pi", .)} solution above, he implemented the following function that computes pi applying Gauss' spectacular AGM-based (AGM := Arithmetic-Geometric Mean) approach [Borwein and Borwein (1987), \emph{Pi and the AGM}]; I have added a \code{verbose} argument, explicit iteration counting and slightly adapted the style to my own: <>= piMpfr <- function(prec=256, itermax = 100, verbose=TRUE) { m2 <- mpfr(2, prec) # '2' as mpfr number ## -> all derived numbers are mpfr (with precision 'prec') p <- m2 + sqrt(m2) # 2 + sqrt(2) = 3.414.. y <- sqrt(sqrt(m2)) # 2^ {1/4} x <- (y+1/y) / m2 it <- 0L repeat { p.old <- p it <- it+1L p <- p * (1+x) / (1+y) if(verbose) cat(sprintf("it=%2d, pi^ = %s, |.-.|/|.|=%e\n", it, formatMpfr(p, min(50, prec/log2(10))), 1-p.old/p)) if (abs(p-p.old) <= m2^(-prec)) break if(it > itermax) { warning("not converged in", it, "iterations") ; break } ## else s <- sqrt(x) y <- (y*s + 1/s) / (1+y) x <- (s+1/s)/2 } p } piMpfr()# indeed converges *quadratically* fast ## with relative error relErr <- 1 - piMpfr(256, verbose=FALSE) / Const("pi",260) ## in bits : asNumeric(-log2(abs(relErr))) @ \subsection[{seqMpfr()} for sequences:]{\code{seqMpfr()} for sequences:} In \R, arithmetic sequences are constructed by \code{seq()}, the ``sequence'' function, which is not generic, and with its many ways and possible arguments is convenient, but straightforward to automatically generalize for mpfr numbers. Instead, we provide the \code{seqMpfr} function... \subsection[Rounding, {roundMpfr()}, {asNumeric()} etc:]{% Rounding, \code{roundMpfr()}, \code{asNumeric()} etc:} In \R, the \code{round()} and \code{signif()} functions belong to the \code{Math2} group, and we provide \code{"mpfr"}-class methods for them: <>= getGroupMembers("Math2") showMethods("Math2", classes=c("mpfr", "mpfrArray")) @ For consistency reasons, however the resulting numbers keep the same number of precision bits, \code{precBits}: <>= i7 <- 1/mpfr(700, 100) c(i7, round(i7, digits = 6), signif(i7, digits = 6)) @ If you really want to ``truncate'' the precision to less digits or bits, you call \code{roundMpfr()}, <>= roundMpfr(i7, precBits = 30) roundMpfr(i7, precBits = 15) @ Note that 15 bits correspond to approximately $15 \cdot 0.3$, i.e., 4.5 digits, because $1/\log_2(10) \approx 0.30103\dots$. \paragraph{asNumeric():} Often used, e.g., to return to fast (\R-internal) arithmetic, also as alternative to \code{roundMpfr()} is to ``round to double precision'' producing standard \R numbers from ``mpfr'' numbers. We provide the function \code{asNumeric()}, a generic function with methods also for \code{"mpfrArray"} see below and the big integers and big rationals from package \pkg{gmp}, <>= showMethods(asNumeric) @ see, e.g., its use above. \paragraph{Formatting:} For explicit printing or plotting purposes, we provide an \code{"mpfr"} method for \R's \code{format()} function, also as explicit utility function \code{formatMpfr(x, digits)} which provides results to \code{digits} \emph{significant} digits, <>= cbind( sapply(1:7, function(d) format(i7, digits=d)) ) @ There, \code{digits = NULL} is the default where the help has (``always'') promised \emph{The default, \code{NULL}, uses enough digits to represent the full precision, often one or two digits more than you would expect}. However, for large numbers, say $10^{20000}$, e.g., \Sexpr{x <- mpfr(10,80)^20000}, all of \code{formatMpfr(x)}, \code{format(x)}, and \code{print(x)} (including ``auto-printing'' of \code{x}), have shown all digits \emph{before} the decimal point and not at all taken into account the 80-bit precision of \code{x} (which corresponds to only \code{80 / log2(10)} $\approx 24$ decimal digits). This has finally changed in the (typically default) case \code{formatMpfr(*, maybe.full = FALSE)}: <>= x <- mpfr(2, 80) ^ ((1:4)*10000) cbind(x) # -> show() -> print.mpfr() -> formatMpfr(.. , digits = NULL, maybe.full = FALSE) nchar(formatMpfr(x)) nchar(formatMpfr(x, maybe.full = TRUE)) @ \section{``All'' mathematical functions, arbitrarily precise} %% see ../../man/mfpr-class.Rd %% but also .... %% {Math}{\code{signature(x = "mpfr")}: All the S4 ``\texttt{Math}'' group functions are defined, using multiple precision (MPFR) arithmetic, i.e., <>= getGroupMembers("Math") @ % \code{{abs}}, \code{{sign}}, \code{{sqrt}}, % \code{{ceiling}}, \code{{floor}}, \code{{trunc}}, % \code{{cummax}}, \code{{cummin}}, \code{{cumprod}}, % \code{{cumsum}}, \code{{exp}}, \code{{expm1}}, % \code{{log}}, \code{{log10}}, \code{{log2}}, % \code{{log1p}}, \code{{cos}}, \code{{cosh}}, % \code{{sin}}, \code{{sinh}}, \code{{tan}}, % \code{{tanh}}, \code{{acos}}, \code{{acosh}}, % \code{{asin}}, \code{{asinh}}, \code{{atan}}, % \code{{atanh}}, \code{{gamma}}, \code{{lgamma}}, % \code{{digamma}}, and \code{{trigamma}}. where currently, \code{trigamma} is not provided by the MPFR library, and hence not implemented yet. %% cumsum(), cumprod() now work! \code{factorial()} has a \texttt{"mpfr"} method; and in addition, \code{factorialMpfr()} computes ${n!}$ efficiently in arbitrary precision, using the MPFR-internal implementation. This is mathematically (but not numerically) the same as $\Gamma(n+1) = $\code{gamma(n+1)}. Similarly to \code{factorialMpfr()}, but more generally useful,the functions \code{chooseMpfr(a,n)} and \code{pochMpfr(a,n)} compute (generalized!) binomial coefficients $\binom{a}{n}$ and ``the'' Pochhammer symbol or ``rising factorial'' \begin{eqnarray*} a^{(n)} &:=& a(a+1)(a+2)\cdots(a+n-1) \\ &=& \frac{(a+n-1)!}{(a-1)!} = \frac{\Gamma(a+n)}{\Gamma(a)}. \end{eqnarray*} Note that with this definition, \[ \binom{a}{n} \equiv \frac{a^{(n)}}{n!}. \] \section{Arbitrarily precise matrices and arrays} %%% FIXME --> ~/R/Meetings-Kurse-etc/2011-Warwick/1_MM_/Poster/MM-poster.tex The classes \code{"mpfrMatrix"} and \code{"mpfrArray"} correspond to the classical numerical \R\ \code{"matrix"} and \code{"array"} objects, which basically are arrays or vectors of numbers with a dimension \code{dim}, possibly named by \code{dimnames}. As there, they can be constructed by \code{dim(.) <- ..} setting, e.g., <>= head(x <- mpfr(0:7, 64)/7) ; mx <- x dim(mx) <- c(4,2) @ or by the \code{mpfrArray()} constructor, <>= dim(aa <- mpfrArray(1:24, precBits = 80, dim = 2:4)) <>= aa <>= capture.and.write(aa, 11, 4) @ and we can index and multiply such matrices, e.g., <>= mx[ 1:3, ] + c(1,10,100) crossprod(mx) @ and also \code{apply} functions, <>= apply(7 * mx, 2, sum) @ \section{Special mathematical functions} \code{zeta(x)} computes Riemann's Zeta function $\zeta(x)$ important in analytical number theory and related fields. The traditional definition is \begin{equation*} \zeta(x) = \sum_{n=1}^\infty \frac{1}{n^x}. \end{equation*} \code{Ei(x)} computes the \textbf{e}xponential integral, \begin{equation*} \int_{-\infty}^{x} \frac{e^t}{t} \; dt. \end{equation*} <>= curve(Ei, 0, 5, n=2001); abline(h=0,v=0, lty=3) @ \code{Li2(x)}, part of the MPFR C library since version 2.4.0, computes the dilogarithm, \begin{equation*} \mathtt{Li2(x)} = \operatorname{Li}_2(x) := \int_{0}^{x} \frac{-log(1-t)}{t} \; dt, \end{equation*} which is the most prominent ``polylogarithm'' function, where the general polylogarithm is (initially) defined as \begin{equation*} \operatorname{Li}_s(z) = \sum_{k=1}^\infty \frac{z^k}{k^s}, \ \forall s \in \mathbb{C} \ \ \forall |z| < 1, z\in\mathbb{C}, \end{equation*} see \url{http://en.wikipedia.org/wiki/Polylogarithm#Dilogarithm}. Note that the integral definition is valid for all $x\in \mathbb{C}$, and also, $Li_2(1) = \zeta(2) = \pi^2/6$. <>= if(mpfrVersion() >= "2.4.0") ## Li2() is not available in older MPFR versions all.equal(Li2(1), Const("pi", 128)^2/6, tol = 1e-30) @ where we also see that \pkg{Rmpfr} provides \texttt{all.equal()} methods for mpfr-numbers which naturally allow very small tolerances \code{tol}. <>= if(mpfrVersion() >= "2.4.0") curve(Li2, -2, 13, n=2000); abline(h=0,v=0, lty=3) @ \code{erf(x)} is the ``error\footnote{named exactly because of its relation to the normal / Gaussian distribution} function'' and \code{erfc(x)} its \textbf{c}omplement, \code{erfc(x) := 1 - erf(x)}, defined as \begin{equation*} \operatorname{erf}(x) = \frac{2}{\sqrt{\pi}}\int_{0}^x e^{-t^2} dt, \end{equation*} and consequently, both functions simply are reparametrizations of the cumulative normal, $\Phi(x) = \int_{-\infty}^x \phi(t)\;dt = $\code{pnorm(x)} where $\phi$ is the normal density function $\phi(t) := \frac{1}{\sqrt{2\pi}}e^{-t^2}$=\code{dnorm(x)}. Namely, \code{erf(x) = 2*pnorm(sqrt(2)*x)} and \code{erfc(x) = 1 - erf(x) = 2* pnorm(sqrt(2)*x, lower=FALSE)}. <>= curve(erf, -3,3, col = "red", ylim = c(-1,2)) curve(erfc, add = TRUE, col = "blue") abline(h=0, v=0, lty=3); abline(v=c(-1,1), lty=3, lwd=.8, col="gray") legend(-3,1, c("erf(x)", "erfc(x)"), col = c("red","blue"), lty=1) @ \subsection{Applications} The CRAN package \CRANpkg{Bessel} provides asymptotic formulas for Bessel functions also of \emph{fractional} order which do work for \code{mpfr}-vector arguments as well. \section{Integration highly precisely} Sometimes, important functions are defined as integrals of other known functions, e.g., the dilogarithm $\operatorname{Li}_2()$ above. Consequently, we found it desirable to allow numerical integration, using mpfr-numbers, and hence---conceptionally---arbitrarily precisely. \R's \code{integrate()} uses a relatively smart adaptive integration scheme, but based on C code which is not very simply translatable to pure \R, to be used with mpfr numbers. For this reason, our \code{integrateR()} function uses classical Romberg integration \citep{Bauer-1961}. We demonstrate its use, first by looking at a situation where \R's \code{integrate()} can get problems: <>= integrateR(dnorm,0,2000) integrateR(dnorm,0,2000, rel.tol=1e-15) integrateR(dnorm,0,2000, rel.tol=1e-15, verbose=TRUE) @ Now, for situations where numerical integration would not be necessary, as the solution is known analytically, but hence are useful for exploration of high accuracy numerical integration: First, the exponential function $\exp(x) = e^x$ with its well-known $\int \exp(t)\;dt = \exp(x)$, both with standard (double precision) floats, <>= (Ie.d <- integrateR(exp, 0 , 1, rel.tol=1e-15, verbose=TRUE)) @ and then the same, using 200-bit accurate mpfr-numbers: <>= (Ie.m <- integrateR(exp, mpfr(0,200), 1, rel.tol=1e-25, verbose=TRUE)) (I.true <- exp(mpfr(1, 200)) - 1) ## with absolute errors as.numeric(c(I.true - Ie.d$value, I.true - Ie.m$value)) @ Now, for polynomials, where Romberg integration of the appropriate order is exact, mathematically, <>= if(require("polynom")) { x <- polynomial(0:1) p <- (x-2)^4 - 3*(x-3)^2 Fp <- as.function(p) print(pI <- integral(p)) # formally print(Itrue <- predict(pI, 5) - predict(pI, 0)) ## == 20 } else { Fp <- function(x) (x-2)^4 - 3*(x-3)^2 Itrue <- 20 } (Id <- integrateR(Fp, 0, 5)) (Im <- integrateR(Fp, 0, mpfr(5, 256), rel.tol = 1e-70, verbose=TRUE)) ## and the numerical errors, are indeed of the expected size: 256 * log10(2) # - expect ~ 77 digit accuracy for mpfr(*., 256) as.numeric(Itrue - c(Im$value, Id$value)) @ \section{Conclusion} The \R\ package \pkg{Rmpfr}, available from CRAN since August 2009, provides the possibility to run many computations in R with (arbitrarily) high accuracy, though typically with substantial speed penalty. This is particularly important and useful for checking and exploring the numerical stability and appropriateness of mathematical formulae that are translated to a computer language like \R, often without very careful consideration of the limits of computer arithmetic. \bibliography{Rmpfr,log1mexp} FIXME: \textbf{Index} of all functions mentioned \dots \end{document} Rmpfr/vignettes/log1mexp.bib0000644000175000017500000000272112057434374015727 0ustar nileshnilesh@article{DidAM92, author = {DiDonato, Armido R. and Morris, Jr., Alfred H.}, title = {Algorithm 708: Significant digit computation of the incomplete beta function ratios}, journal = TOMS, year = 1992, volume = 18, number = 3, issn = {0098-3500}, pages = {360--373}, url = {http://doi.acm.org/10.1145/131766.131776}, publisher = {ACM}, address = {New York, NY, USA}, } @InProceedings{ieee04:log1p, author = {IEEE and {Open Group}}, title = {The Open Group Base Specifications Issue 6 --- log1p}, booktitle = {IEEE Std 1003.1, 2004 Edition}, year = 2004, url = {http://pubs.opengroup.org/onlinepubs/009604599/functions/log1p.html} } @comment The version of R, where MM introduced the R_D_LExp() macro in dpq.h: @Manual{R-190, title = {R: A language and environment for statistical computing (Ver.~1.9.0)}, author = {{R Development Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = 2004, month = {April}, note = {ISBN 3-900051-00-3}, url = {http://www.R-project.org} } @Manual{MaeM12-Rmpfr-log1mexp, author = {Martin M\"achler}, title = {Accurately Computing $\log(1 - \exp(-\abs{a}))$ -- Assessed by the \pkg{Rmpfr} package}, year = 2012, organization = {R package vignette}, address = {on CRAN}, url={http://cran.R-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf} } Rmpfr/vignettes/jsslogo.jpg0000644000175000017500000005431312057151345015675 0ustar nileshnileshÿØÿàJFIFÿþI CREATOR: XV Version 3.10 Rev: 12/16/94 Quality = 75, Smoothing = 0 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀˆ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ÆÙœddö ÇƒÛó«r9ÇNÔͤõ®í$¬Ñ7~ëI´ôÅYÀïÖ˜Aëý)_knÉÀ¥ lŸ¥KÓ©Ídã@Æy`/ g4mö©0IêjC)\h®Tc‘Í $㊜B} 8CøRº›+N‡­8}*o$çÍSgúQ΂̇‚ÄbšÑäðµh@ÙéOíÉ*ô£L©ÉᦑÇÍ_Ù?rŸö^Fõ¥Î‚Æf;Œ{ûRù~¢´¾ÉŽ6Žýi†Ü‘Âoz\Èv3ü°O< FB0qZ‚Èž6ñïCYd&EÈ,d'¯N˜¥XÆ6€ô­o±g‚¹ Ù r¢Ÿ: L³è9Å6Ú;V§ÙF *G†Û…£ ÆVÆã½'”KmÆMjýœÿw4ñgÓå¥Ì‚ÆYÔóI·t;}iJŒÖ¯ÙAÎGaGظÆÚ\È,dàƒ4ï/ڴŨ=þTﲌŸ—s ±œ#Ç¥8!Íh}˜€0{ûRˆ@þ(ç þO¯j<¼õ­&·8R ?ìçð£ÚŠn´õ€b®‰vžbÆ úQíÈg˜#½ ‡j¾a$pü)LDvϽ.på3üœ”y\Uÿ!‹8¥6øÇ"Ÿ´ ¼£éšq‹ÐU±Šy€âŽaX¡åã­7ʆj÷ÙÉ >¸£È'·ÒŸ5‚Å}§Ó¥7`'¥^ò:S,@ùsKœ,T =)DY?J·ä·qO°À^”s”¨W=¸¤òøàUï+$ {b”BOsG2)@Ž"šUH­à˜`öùÑ6(qH@éz¾-Î~ï¾@¤kp2zóO™A”wJŒ¨ükE­1Ôsèi¦ØçQÎ…fPÚ;s@<о-pH&[sÁ¥Î‚Å]ª"“ö«ŸeÈÁ£ì˜ê(çC³)Š‘˜ŒqÍXû7?­;ÈÉéÅ.d+3Á£J¸- éNû#c Tó¢¬ÊYãž(Ͻ]ÁÛÍ/ÙŸþyþ”ù¬Q`ôm©Öå‚E;Ên¸éG2 2©QL!V2ÌBÉ>• ÖÍœã£{eòŸxÊczÒu,®5»UïŠâ†w†Þ0)ÆãÐÔ6^*µ–xBÇk`óT|C£®Ÿ¨k¹¢pd==jæ•¥Bt;Bp Æ"ç½sºú\ô'£Çc(e;äj”X§§J—J‰†kæó'”¹©ÎëíIÕ0T•ÊÍ:çA¶‹ «‡qùši(Ï4Qû2ªÛ§¦MH!Nê?*“àp*=¨ý™”¤ò(òWÓµ1þé0A#ÒŸ´fC´£éM(;а@â¨ÅÐ9 ûWŒ <±ŒV6sžÔc·"h„…;Ëg§Z~Î3ÍdOڢўp)|¥î8§líJ#ùqUír23öæD¹è*]‚ƒÅÑ •‘yKž”ª‰éúÔ‚"(ˆzdzÑíÔ D&—Ê@Ü ›Ë\pE]À@¥íWqû6D°¯8žPǧ­LAè>´m=û{Ô{TW³+Âð§ˆG ˜F6–=¨ÛóžiûdÌ‹bÒƒõÆ*p£¿?JaPqŽ”ý¨½˜ß)1ÔÓLJG&À;š:t£Ú!FÇ_zr ïJXŽÜÒÅÔ9‘W#£´ª@ÀíK»"jÃÙ eÿ•&Õ?Z íŽirqŽ”½½Ñ´ûçÜR¬Y´½»±HoéùÒŒüø `Ž}iT ÞÔ{f'IÚ1ÆN=é›pGƒR䔀æ´U™’#Ø1×jO(qÍM·èÇ9àÓöÌ^ÉÌ]»ý)¦1Vø­|¸ç9Í?¬‹Ø•Ê69â“gÇ7qœ†OSUíÉö#cC’ÞžÓ”G=)Ã’)ûq{!ÝxëC 4üäã½9±·4ý³'ØãÒ™=ÍL£Žq×4¥~ÿCžiªÁìˆx÷â”FFH Ÿ§n´ãò§í…ìˆÄGõÍ;ʤ\Í)¹ªUEìÑÌr*ÅÎy5.4ñ“À⟵fˆ6œðx¤Œ@5chü)6ûu£Ú‹Ù £žsIŒõ5.Õ¾iH¹£Ú±û"œdô¨Œ\*ÏŽïIÎzgŸJ=°{4VÚÃך<¡ƒŽjÇÚ›QKÚ‡³+2ñÁ9=©úwö«'Žƒ½3#¯ÔÒöìÈBŒñ×úÓÖ 94ð~”ðJŸḣädþ4½8=sRàp3÷<ÑíÈ7dÒuç?øíMÆ"“#Öiæ„ >QÈéëŠv8Àç·ô¡Jíè?\€=ñÖhÍyã þÎk+Äm·I—*1ôô­MÄg'§=+Äq–Ó¥©v>[{¦¶ûë†ÉæºK®–ý×^•Íé!EܪNÞk~üÿ¢)ÎBsZUÜÒ¢HAPW““Šˆà{Q ²…Ô‚0sŠV¢¸ÑmÈàœ~5sŽ*RH^è €sRÙ6!Ú~†‚*NøÈ4Ü ò(¸XhÎx¥PG8Í<àžFIb‹²¬=@viFAé@ûÝ9ªšŽ¥o¦[™ç#=£y +·dIjy¢¶·’âv Xž‚¹³«ÜëwÑE¤ >ʇ2ÌFúU?³êÞ(ºî¢k[% ˆ±Ëzë­­ ±·@»Pª\°ZêÁ+²vQŽNžõN:æžNW‘ŠˆõàW5Ù­‡gzPØäÓ&ŠWcXdâ‚rhûÝx¥+Ç\VA$šP8÷£iè9¤ÁÏ þTÂsœõü)à69gÖ™‚OCO ÷¤¸£88#šANãHAŒŒÓƒ~”œç8¢‹‡*ô4õ>¼fN:f€ 9§ÌÄâLHì;f”´Ü~éÈ¥@âŽf€WœšO/¹8ê3ÜQœfÅÊ4§¯4,dŽœÇó§©È¨–ˆÄxëÔS‚b¤\sŠx#t'Þ™"°ÈÇ4¦3·?¥H1œgŸçG˸súÕ¦¤x ò1Åyçô§6Öò}é29çÒ‹±XGÍÈëO+“œqšp#8ìN(Óój“ˆ(Š“âêéFwE_1ÆF>™'ò¥œŽ)F¥ÁŒfŽf‚äÎãA\ ž=ÍC%å¤ÜŸïHl,‰6àƒÜ0q޽«#Qñ^“§Áº;˜®%<,P¶â*¯mâƒ76ÊÇù-œPî‚É›¤Ý)¸95‡{âØ-0ZÂí¸ä…â¹ÝWÆ÷÷´» #'ø¤oÊš„¥°´;Ü÷Í7$޵çVWÚÝÄE®ÌèHÆH9úWGg¬Ëgnâvó€è0F?IÂH¥Êo@éMÆù×/qâ]I›÷6‘¨÷æ–O¨/íÂG’ /j%`VgP¡äŠñdä ΋VÓ¦PÉ{«Yú¿‹,t¿-GúC°ÏÊÃëY¥6ì7‹=†sHqë­p²øâöuÿF¶©95š%ÕõIKK,çæìH ô­}›JòvNû#ÒšTŠ=îÁSÔšíPö’<×A\IÒo§a½¿‘áSþ­jì5ãlÜq÷øVN¤#§1k'ÐêAÈçüÿú©À:àf ²jAÈæ·lÉ!ÌÜqYú¬fM6S×½^›j)Ÿ¯Gz«æ›">Õ׆«Ìœ™5âã¢='Dð¼:V“W(¯>3!þ”¯,±B¦îÕ`ëp_A˜ Ž21õÅdÝß,lT±/Óã^m[ÎnÇMËI$¬Ø×OóøóQ}¶Ôqæ/çX:äÓIº¶×™‚QëYÇÃ’ƒ'5´0ªJòv븻#ÑNM/<`Ò(R)üv8®ÿª¾ç•õ…ØNýj78òOCÒ¤lUKéD63¸<„8¥õVîXO¡åÚ«â÷pçæ5§$û¬be<©ÍbêD™½hÚ0:iïÎk¥­âõ;o]&hrN0Ã5¿#ÄxRåWRAž*A®ø¨ç<œþ&¹'C™šûnR–æÏ§ãJdçÚ¬™åqMs)/…úžj~¨ßPúÂìUçþu"ÉÜŒíÒ²ïüG¦XäÞã€qÚ§ŽgšVK*±T°rîßÈ[[¼Éæ ÇNõÁkž3º¿o#Ni#^åO'ñ¬¨­õ}~uF9<í^ƒ øÆÆ5ü $Ì2“…­cJ4÷Õê¶Î'HðÝy’–<¬ž?:ê£ða+þ‘{ÛøEv©0 H*Ž ŠÝAýjgÏ-†ªEnqøØŒ¥Ì€û¨®;]Ӣѯ¿š$8ê1õ¯fò€ÇgšñÏÊÄw ölUQS¿¼ÄêEìŒF)Ó¥BUʹ¯Z™‘HÝŠŒÆq]¤VŽÒð?ïQ¶»w<÷®ò9¼’NPŒúכ鄛K˜³Ó =vmré „Ç%$M¤ÿZ™E¡¹À%ò¸Áè P·¡Ôná$à|Ê3ëQùûØÀÉõª1ÊÇYžsÛê)˜$iêöl&BÙz äÑ|² š7íšè¥fe œcŽkôó}ãaúR6¦ì¬zf™oi5ŸÏo ×-'® +%#m¤é¬¿ Ì'Ó fvˆ çÒº )ÏÊyÕpò”®™Ô«Æ+T@¿(Â(Qì)rIëÏz”ô¥ ½p*V÷¬Ç±ÁÇúŠÚxgÐU€ªGAK±3÷E?ª>áõ…تyàR}F~µgËÒå&:Rú£îX*ž¿QɦçóV¼” ‚½ DÝhú›îXE<ý(==êד*1G’„p´}M÷Ö[¶{Ò>ÕoÊ_îÓv!þG­R}Åõ•Ø®c§>´¥°¼ÔÞJö@)UQÊ{ñOêO¹?Z]ˆç§¥'™‚sS…ÆFÎ;ñY7þ!°°fV;¤^ªõ§õ'ÜXò}¨Cc÷nq¾µÆêÞ"º›y3a챜Tµï é7"ªàaTzÖÊó[å©<šÒ•©nwF¦ƒhoÚK¦šTNTg?\ÖÔ‹G´[ĤP Vužº–v‰mn9ÇEŒdšÑk{¿²¤Æß÷² …êyö¨«vÍcdŒÉôñqwçÝJÞXF‘·Jž[Ø¡Œ*œ©Ýœñ#Âfó€Ûåúú~fÛD†ádŽâm·B"ÞRžžßZ}Âæ\úž[q䎞Õ]n.ïä1[¤²Iè¹âµ4¯ ½ÔîoÌ‘À£·«©³¶³ðüR½„; Œ33HëTç¢æ{œÅ¿…¯Þ{¹„ÝŸÏÒ˜Úu•”2M;‹™€ù”qZwú¼ÓÆèOÈzZç§•¥b3Ç¥RR{’fέÀP`1W´­*ãT¾K0¦R¹%ºQ¬io+Œ¯§½uþÓNþgýü«ÀôëÕTáp§MÎVFî“á{}´¦S5Ôí9è29ãÓ5OMÓãÄ‹o0ß¼Cånƒ§o­[¼Ô¼˜f9~Ù듊ÓÒ·ZéâyQVæRd”êxʼå^Jò™Ó*I+GrÞ§~\qc#=;{W/­ù­ëv×U$HôÏÐÕëÍA¦—ƒ:`zÔQH ›³’9=ÿÏÿª°sn\ÆÑ§Ë‘ŠÊ(BìÀµaNÊgyºp@>œŸoóúÔ÷7oå€9À¬«›Œ®ÜdšI6ÊŠ2õKéJ¤PçÌùkÏá]…¤C¢ÙÊÎIå嘨'è+Ž2}£Ävp“ò#®}€95ÙÏ3y„xÈÇùú×U_ÝÅ(õ2·<ŸÉç>YfcÁÈŸJ•Œ“?ÍŽàƒþ})o´p½eÏpÍs´\I#`ý(¥IîÂsKDI‘w. ìHA¶ù8­…Ô¥Ú>ÿJÈÈ:¹µ_ø÷¶\ŸBqŸçXòkFÚÿ.N>•·+fWG¨©@§8®Hx’ÿˆ¿ïš”xšü mƒñZõ6xÊHê9ï×½VÔâ2i7\Ë#ʰе ðuþéÿmÇŠ/æ´š'†8üir1¦Žüçgz½¦6mÊûf²o$b#ö«º\‡kƒÓ¤Ö‡Lw&­as¹9­˜üo¨ˆÈó²=HÎ]»É!{㚈Z)Îì¡©V°åczãÇWùÂÌÎz t¬™µ}fñŽéØ¢ CŒAAîÕ§omo §"BÝ=+D»"’)YxvÿT”²Ìí×?:î4O‡ÖðÇ·ßþy©ü¹§ÚxÀÛB‘C´aFU8þu~/5ÀùŒ~ƒŽqþqPá2}¬M»;+-62–°„ÏšÌ{.k-uw—Oþ½ ©Ì9ÌíÇÿ^£Ù°öˆÑ.Û¸ž3øÒÜwïXÒkwòØ)ÖŸ¤kªßKo²3å®IQC•ÁI=l‘·Sç[Ó*´dcŽsþ*çî"hb•KnùO&ƒH£Ñ¼ óhVýˆS]IQƒŠç<48øã®‰8ë\í»–ÄÚ}¨éÚÇõ˜<Óê=i\›gŠnqÚ‘œÊ‚{EÂÃ÷{P£'Ðý(&©\Džaõ 1ÍAæs‚1“Fì~4Á’³d{â€@èO¶*#qŸÖ—¯+ÜzóMr|ÒŠ‹w'švþi«‰²ZBê3LÝÎ .áœw«ÌÝvæ[{0"%w¥‡jó­JÞ C—½`OQ·½z•ݼWPœdΰ®<%kr§'ç>¿ýj—¹¬^‡œf@‘¤©8lúÔܱÂ8lø¨ÏÒ±µ-Iï£DAå½½~µ-¤†¢åÐÙ¹ÖÞê=°³8Ï÷ªî‰yw£Ë%ÄK¸¸ÆÖk”³¿K@0»^>!lòœW^vô;é{8«˜ñ…ú½”}s×®wÄ×Í«Ä.Œ"6N•ý¸Ääç­I¦.Õ —?8À&•5>mP§Ém °à®*FÿWÓšŠØ€Jž¢¬lÎsÇzèfDš+Ö­Xð7[¶„6ç?é„ëÅs–gÉÔm΋µtV¼ÓfçƒrI>¼ L‰ì[Œv€ ÉÅPÓîDÚØ…ô5q²Ñ¹^ÃÒ³t«c ÕÛÏALÉlhÜJ±DçÐb¹ùä2œg‡`µ{W»e”*.#ÆMd,án¢ß’±Ÿ0ãó¡lizöƒp¶:Liœ7j¼uXrr@ãÖ¼•üi9P‰*?øL&þ8A¬ùÜRR=hë0÷—zŠ]RÉV9é^Sÿ [Ì_­HÃüi¨¤/±èCPF'÷£íè œWÿ «cq—ò kö¹1ô§Ê»“ïö;“©)î:rsÒŸöå'n{ó\T^!´ÿž¤cÚøŠÊ6?¾cŸAÖ«’=Åïv;Ÿ ?Ï\ç8ïŒ×|_h˜Ê}öÒZHŠsž¹üiY¥Øô%›'ƒšx%ÏqÀçéã«ë ãAçVãñö™ÀÿIQî£üh²+ìw1ßxäý)ãŒgñ®B?i.?Ö·ÓmJO?z£Ó®Ö 9mnãf#Œ®:“L1é¹û“þB§™­‰älÓÇhÈçëNÍŒà=+–/¾ì‘ƒã C²Ç]çìäu‚ߌ¼Ô:„Ékc&üå†rMrgÅZ‰<´xôÅ2}ZçR„yäaO PØÕ7r²æ[èÀÉàVíØ+ &vÖ6š7^†«jñƒK·ýŽk)nt­ŽêØ´ÚE³((+2ïr‚%½»Wÿ Ž¥BÚ!—Àùiã AþúÄGûµhæ•6oLû½8PÂÇ Á¬ŸøK/p@Š}VøKõ8KoÆ:«S‘®,æÀ%Hõ≥·ÓÀóˆ2ž‘Íe¯‹u d D#•ŸŽ)¥ìâÚ}ÍQªôùŽ}iÉ©€A-Yæ€yö£ÙDj¼Í³ª!œ~&”jŽÈ™5 foº¤úâ²ùiy´Õ;u­~†çÛßÈ—o-y žDn‰lç‘øVP-žôàÇ{0UŸCOí€ðZ´ž Ö^=i~qÆê=š·}M?ŒRùäž¼ÖIw­l¹ëÏÖd…íÍo8ç­cëÅeùïפó›4ýšli—ç“Å3ÍÞýj™úS|×þñ£Ù‹Û£0(ÅMò×5%²Á,Áer ÷Åtœ…lÕb> Æ1Í>împb ät"£rBí@z{®¤ÏaÒ­ßf)É< ‹Ã±àLàsŒŒÒÎáêMDÙ¥5s Ú6OËøÒ}»ÿ:Ñ`6úÔàóP¤ÊqHª-¨§ 5èZ¤=:Òg'š«²l D`ÀœƒÁ©„’<“Hqœž¸¤ã®zR`!8¤¥=)í@=)¤ô©aqŠaç  œ CÓé ã Ä4HÀðqZ?ÚÍ®üt5šHÏJ’)O™T°öªJâfìÚ«ip¬V ¿‚¨·QW-¹;€Ïî¥5G9"”¢0çŠpçÒŒñLÎ^* q´÷9¤ÍÐ}@ª$BOzô¥íšLäP 1Ï¥8 1@ J •c qš.p¸ïNâ›Þ”z;œf’—µ*J R⓽)†QŠ/˜æðE;© Ç˜¥£ÔÜ)F1ÒœGÒ“¥H :ô¥&€pi  tÈ óFx¤É"‚D*1QíÅ8šiÔÊLÑ`'FmÀ© Ž„zÖüíý©¦­Ê¶.Pm”c¨®oœÔÑ\<`áˆÈüé ×7ôËpºF£s(ÆÈ°‡Ü‘ÇåX™=8¥“Q¹’ÓìÞoîIÉP:š¬²ÐÐÑ6r1NÔyçœPXŽEM‡rb¼ûÒg¨²iI4Xd™ã×ÖûS4þ£é@„æ“&ŒÒÐö¥ m(>ô v}ésïMÏ–‚…÷§•îisïA"çšqã­3Šõ ¡ÔàsLñNϯ5 -)ÐhÎhÔqI¸ã¯jLàsŒP±GãÍ&ñA>èÃSN"…ÝŽi õé@8¦–ì)„œó@Æx§a\xê)賎¦ž2iˆ^¦‚{f˜½!=¨N=Mê ‹>ô â˜®I‘š3PÁëNó?:V Ž'ŒkŸéLÝMÝE„ÇŒfƒŠfxã½â­ãŒuÅGøQŸz3þsLcOb£ûÜv©3Ò“Ž´k€=:Ö–›.ÿJ̳qÞº=5E½®RsD´D–µsû‹uø«K÷ÏûU¥.v÷@Íc®|²}Nk'©qcÉS c¥5ŽZŒ°¡"›ŸÊ“?JhïHxÅP®8ò? Lôæ“8¤ÉÅ4K9 )™¥ ¢˜OjLúÕìÑšfiTÐö£9¦ž”Pçš\⛚;'­¤¢€$¹¨ésÚ‹ýÜR“éQæR÷§ƒ‘Qf”PÁñž´ŸZqäÒ‚zƒE†HHÇ|Òdf£Ï<óIžh°\›w8¥§*0y¥É6\攞*-Ôgž´X.;Š3Ú“q4›¨°ɧg)Œr)¥°iŒ—qŪ r8 šV.x¥ÝU÷qNÈÍU…rlðGj3ž3P†Å85M‡r\€(v5îqG™E‚äùïšM¡Þ)7U`¹1lŒô¦3Á¦yƒÓws‘E€™Ï™ÀÆj-ÃðúRäE€~i ´Í›º‹ ä¹&Øèj-Ø4ÏjvÅ,Oz ¦çš ɧ`¸ìñÖ“4ÚNh&}èÝéMÏ4@ žh¤¢˜®\]>fÀæ™sfö˜Wêk^ßåØOÖ²/.MÅÔŒOµcÛ4’I¡?¼·¸‹pGnk@È5¸ »©éW"'—t@ì Ba mZtÈCF¦i:qëY;šE+cƒÈ¤6Ä÷§“ŽhÉê8¢ìvC~ÈݘQö&nŒ*Q&:Òïô¢ìvEo±>>ð¤ûâ­äP“š9˜¹QWìRôP,¥ääU²Ô§ÌÕÍ‹±Îá“IýŸ.zƒZàdšBÝûÑí$±(ÿfÍØŠpÓ'Ïoή†8ëJ­ó´¹ä>H”?³'ÜRŒbš3šwSÛ1WŠEäu¤š=ZSÚœδ¼Ðy§¨îiƒ= ?“ÔГ¸})2}(#¾h#ž´ 1»úÒŽ´Ñòœ pó€;Ð1g¸C×ç< Íaò¾O4³Êe˜xè)ùN=+X«#;²)9éÚz²S©éx QšLŸ­'z š3FxÅ¥{ÑŸZh§f‚CÚJ=iØâ‚„£4œv£µ(#84dR{ÐM.i2h&›¾€š Íôh$q'ð¦ÒûJ¿k¥Í1 êRÕ"Dí÷FjÕµ™òüÆØÑ†Íæ}ÐOzžfÝ¢7h«ÈÇûž¤ —ìШ˜ñÔÖì:RÛw<𝹆è[Ü(bOÊÀvôýkoc'¹ÎñÖÆ9 Κg–OHšºK´µ·¸Š<‚Y°:—û6Úd; ÈîqŽžÕkû™}cÈæb#&"F}{Ó 0al}kN{!¸LE´¸ÁsƒÖ®6™±ñ>2qG±‘^Ý^u£dËOòÎb˜ïZobÊsŽ:óþ{Õy­a Lã`Xv¨t™J²*5´ª2VªÝ˲- `ŸåWÖ)¬d©ß?ZÓÕà¶Õ´hæ† .¢_›bß,¬Íӿއ;óSvŸ¥B¸ÍYF~•Ðû™¥Ð§KÓ¥4t§g@0ÑKÖ‚($/sIÞŽù 3ß·¥-QIÞŽôê ¢ŒÐP”¹£SB¶:PHîÙ¦SñMÀ ¢ž“€3[vž¾š$˜ Á8Ç|ý(Ì-§*Hm§œâf'ÐV½Ävríc"‘Ù…mèw‚ã6òâ;žÄ ¤Û)+”ôß­²‰ïq»´b®]J6ãhtéÒ¬\+-ÁGçÏ^ŸãTg%†2IβÔÙ+$—<ž{Ö†˜åo#$γ¤[$w©í›làŽ*€ô›t±Ö¤r{š£§J&€@cš´p£OZȆ‰„͹6·æ¨j~Óµuýê훨’.ÿ°IÚ§n•ÇçÚ©HŽ[œ©à}BȻ۹‹Ôp*æç¶žÞB“ÄѰìÃìBC·ž£¾ϵ6Xà˜•U¸æçüö«U•£ÆÜúW§^x{N¹ùI«o[1>T¬>µ\èVgÍ8}+¨o *·3¶>”áTÇ$}iÝŽ\â‚+¤ÿ„dw»ð¨ÿáUû×Cðs ³9ÞÔw®ƒû™Î~•^]2?+.‚ÌÇ4™É­?±EüY¨ÚÙ&‹ ±NVŒJ: fÎàS⊔L"€FihëL4P1FµjŒ•ÈÜö»õ¦ç&¹ÍÇg⣠ç*zš†âC»ªd† ܵ¢\¬tãì×¥¦UxÜ2?úÔ–1­þ· R6›sVY¼ç#¦°¡Ô–]Ø$u¬Ü˜Ô“hê%fšø•@!_z/áRÇ<ñ2Û˶F2 2Œ½ÏÓœRØÅö»[qäqéMœKc"Ý"7ʹÇÈ:uº0ðJ791¼ÚeÉ$TË#?Z¬Ó–…Ùc+`nþURk{™2Ì$útüñúþRGÅJµ±ç’NsŸå]:œüª×1¯¯Ì··ªÅ¶ŽzVÆ“#™JýÚØ#­U³Ò’?0]DËæg‘[qÅ\Bíúóýj#{²ç$—* y $ñÐtÿ?äS‰8|Žø wÿ?Ö—Ï·qM'„'¦OJѳ!Ž3ל¤çÖ«K °Ã("§ü½N}ÏáW4Ë:`Ì8Ï­bÙ¼V†dk2ÜŸfXÇ—»éU4·6ú¸øõ¯B¸·AdÊGÞûל_æÚø2Œ“­rU\Èé¢õ0/힥4ÀG Sb ©Ò¶üg‹]/IQ^°Ôp~•QwŠföÕ•qIJÜfx­›AÅ©TgŠb ozS×zPÚ–—ñ¤ “¥èÏ´à 8¡+[Іcê3M¶DûÿùhÓmÏ ÅiÞƒ§Ú†EåÈÎsAE$Šõ²"ˆe@*xäÔD{pÌ1ÎTéL‹ÄwöêVÝ•8ÆvZžÓÄ· .n7»@4 Å« "ÿP %¬ gæŒÖ´æð%ɲ’!Veÿ–JÜš·¡ë´Ë°~Ø­ùõÇ[¸àD ‘©Æ=ê['S;ÂÚ•m‡P²‹íÙ8ó€`G¶x®© X0Š0çœíÁ5™}KuU9À=ý©–—ï4l“ʇæÇqô¦®Dµ2õKC¨JWåaæHÛÓÏÊ\Úì0ÙÝHê§wä«HNÜúü¹Ís!‰çº~›àv#üi°¦õ°M;ßé±Ì[lÖäÇ3÷‡Pß^OåY’úF8Ç¥>ÎsÄJã1Ê<¹èjþYq€«6ޏ²´£,i±’#öãéP‚q@ΧHŸ<ìm³³“×­rZ\øGç]8o3žÂ³hL˜0ã·¥)'’ªâP£ç5Û"RpÄVXivï!¹úÔm3Çnj¬—I'Lätª†å@'wlñÞ†h4ìAù uÍ@ÎÆȬö½ ŽN_×üÿ…0êK´¸õç¥abóJX•0ºžûN+"]@âçÒª6 ÄŒ~§4ìÅcj[µpã#'çÿ¯Uš\§ðÿ?çéÎh¼-ŒðEFnuz«<÷ÏÒªI)a’qL’àwæ iTŽ˜5HÍŠÌNqŸÎ£bsÏó¦™*3!=ê¬"CÓ¯5j=Ù ·4ìHãL'¹íMõ4QÚƒéE08Í.}è£ñýhH“÷E7ŒÒgšç7!hK6i¿f©«§Šwb²3¦ŒFp9©Šæç^ÇÚ–ñI9–3¤lb”~éø>Õ} öf扪íDäx®–IT(`Àñ‘Íp÷6/n~ÑÝZ·c¯=¸Ê»”õ¥U9ò™Õ¤§¯SfóV¸‚OÜ[¬¸·'§ÿZ¨Á®j¯i''OóøÕØu2l³Î;ôÿ?ãZI³Ü¬xÇ5ºwÙœÎ.:8”þÝ1ˆ%IÎ1»¡ÿ<þ46¥:ýëqïóÿŸjÑ0EÁ ¿•(‡RñÇJ¶Ÿs;®ÆQÕ®1ÿG×ïi‡W¸5“ Ÿ˜V´¨½%é銎H€<Ãüÿžj©i®Æ ö¥<ð”˜ùÉ äãÓôý+gÁ púœÈ­#Z¨ÿ–ƒœö«6:L7SI•àFÍš¹áˆÌ:¥ÎÉäÆk#^ek-æ.O`kÍõ¼yÅÆd®ãYÔŤQ£D_ÏGÁéžõÄjñ, “/×½cSD]vWñ“—»±'kGÈ~•±ãC­ìN‘ÄéYCýSñÚ¦—ÀŽ©|LÏ=i§éN'ÓŠoZ݉šJ1E2Eê3ÞŒRÒgšZLÒQ@ zÒcŠ·g§]^œC#ÖºO1 ×7sü*3I´‡cž²Šió HHÎx®™4K›èc[†Ú«Ð ܳÓ-´øöC}ñR}¥b íëëRêvŒcàø„Dî$ýk*ûÃod$ãµwÜ™06ðGZÆ&R¬3Ÿj<ÆšÊá|¬¦ºí6úZÖ8§r“[·šTdzŠv­áä–d8=zW/åËc:†ùJ·Ë'§±ö5[Œõ(Y~Ê.ÏúŸzÁÔ.ÿ±¦IÎ0˜ÏrTÿQYÚ^¸6½•ÖQ\Ý=ëvçM¾š(ýé_{{5bô%Ì1\DÃË‘A^>•ZýQa‘°¤‘‚qïU`–m/FŠ!ñ+’q…ì¥U¹½v‘œ°òž p:Ò’ÔÆ ™Ñ9?¼$sŽý $šCžwÿŸÂ‹6ÝùÝ@8üè‘·6Gp ÿ?ü)3¢$ 8öªü÷;t$æ ©4d¶’˜å29´º‹ªc9'Ú³-¢‰"k‰Ø,qŒŸz„x†b±[:­Nä¶hË©ÎIãéUe¿lîÉȬÉuç$ƒkæj?í¤'-hÑ©Ø._þÒaÆ=?N•—ùõ* Õ-ÈæÔøÿZ™öèŸÜ°ª°®[kýËŒTi'€W7±cåSQÏH†~´ì+—YŸƒš‹Ín¸ªÍpäp¨w1±§b[/™X “úÔfc޵PB´X.Y2îï“L-žõCÒ–-HNzÒQA!EPKB‘ߎ)(>´QÚ€8 î}飭‰ü©¤Å4âœ+ŠiàW9¸ÒZQœRícÓµ'sŠISrÕ"1žG¥‘ŒzÓƒã+ Å2 {ç„lš3ÔTÇì×gäm®}j-[ÆEV*Tð:UY=ŒÝÑpÙÜÃÊÃÚ¥‹P¸‡±ªIs4G†8üêSz|ñƒE˜îkCâIW Ūì^%\|ÃëšçCZÉÔ•ü)†+|ü³Œ{ƒNﻓÝ#°MvÆ3Å^·™.ù@pa\,PNÜÀᾆº? ë'NÕ>Ë~€Ã?ÊÀóz—9­S¸½”KÖ“‘œ†ŒŒÔZ,:”„½l_zŸN•VÖt_¸„…úVm†§ ñH´Vù„qïÉÅi¤®s8¸¶‹Ý¥Äþ[Ä¡‡›n€×)ªæbb2ùÅz$ŠLez×®ÆÂywp¾h8ük:«Bðï]NÄNf×®XžCcôªñݸµ\ñ «[k,X²Ëô5MF#sÐb”]àŽÆ½æg7ZJRrئšØÀ:RÒc4”¹¤¢Š`=T»Q’k Òt4•‹Lw‘Øt¬ûDQ‰\rÜ ì´xvÃóz†ËHÒ‚Þ+hDHª01Å8ä¨â¥êOÓ6àrqPW Ð¬x#?c±oµÉ§c[|»=:×>gk•±¸“òŒõ©8œª†ƒÜÕ‘?9ÁÎzw¬È¥iù$„þ÷ô~X¢Êsر¢ábàÉûÃֲ5=.ã%>•¤Bõ'Ôš‘$eh\§qe=º…9dVÈ rµ=ˆ®ì›h”°‰®ÂæÂ)ó•õ®bÿÃÊId#9éZ)&K‹gÅh RÛHÊÀ‚þu™7w*DfŽ4ÇË9oóÇ­bÏm4lÉÏAÍlXéó^Jn%]Å"Ü@î àÿ*¢v4ì-<øDPnÈíß9áҪȅ Ï¡ãÓµhœYêyƒ[É‘YOQÔ~5Vàn“'<žxÅK5‹*õ¤Ùž1Ö¬³€NqþÏó© ‡Ì”Ž9ëRY­\8ah:YöÜÊ9ÆYÕ¿ä'pÚÅQF(Ù«KhcÔ³pÀ±ÀïQyGnjÁŒI‡Q‘Þ`dt•ÂÅ3ÔŒRgŠ–HðMBx5D‹Ú…RNi3OSƒžÔ0%M0¯qJbšNx¤†Ä¥=)1@þÄ-RšN{Pð(8£©¤ï@4RŽ””z{QßQG¥´¿JJQÖ€ 8ô¥ïNæ˜!qŠNœƒÍFeP:Ô-qŒâ°³6¹c$ô4±Ÿ~õTK+*“øS¶Îz!?…;dï* äÓEÒPg9¶~Â×0PÏ¿v¡µbã$aR4 t5fæÑ­ãGÜ1Æ=*©5ªwF2V`æšTƒÒš:Ó ´g*H÷¨“›†µoùhÖa¡¦¦é¡íšÎ¦×îzV‚´û¡ƒ½Eféšk<çýXC'OQÅnxqXÅ2í õ÷«pÛµ9fPØh”iÐø k;M¢ÌÙÚ@ǹ®GÄpùŒäsÇ?ZëäÆF+žÖ¢ Œðzb®¢ÐÆ—ÄŽ_ÄЙô½:ü œyN}1Ò°ÀýÉïÅu3¨—áóïSæG?¹hÉ1Óåüë––ÖìÏMîet&žsJÝOÖš+­Ì7{QšZmî•w4Úµa›w 94¦HÅþ í¬#òíÐ0Á®6~¾™¯@FÔÀè+&h…Éã'’irÀüi’±1ŽsÍ?LL ·òù:|¬N0¦¹{Œ°ËEuZ¼M6—rŠ2q‘\M“æãžÜ ö4%¡WÔé-œ`ïùFô>ŸZ¾³ÇÝAЂ²!1ûªx㯽[I œmµ"‹ñÊ ä|DZ5:³ÏñTáÞ[åR:rE\Œ.ì—ÉéÖ¥n&Êòj ˜w|À|ø©PzÓø`GSKa3„ÔãjQ¼£‰#Û½hŨ[Ç +dûd·f*qþ¶&9?áRx‚Ü'©ë\Ô3Ë Ø°SGjéNèÅ£p·.ÀaHÂAÍHcÉQÜ`O_N{žjv.»æROqžßçú}jÌ—*x'zž9þçŽÕ›5ŠÐfÒåÉ#§–ÏéV­‚0sŠÝÛ$ŒÇÿãþy«QF¹% àäÎ+YRºœãý¬Öq­=z@u™ŠúóY™ïZ£K̽ =œ1Îy5]xæœh0<óQ¸*ÜŒSrzf‚Äõ4€0(cš3š:S$4c½­)éA@E/ni=)G^h$0qAÍ:PO4”QAäÐEŠZJ Í Ð8¸¤ £J÷0'†Úi±ëV-£†æ§‰‹®GíU”–Y äÅav΄£dH²°RŒÔ°,ª Ý{g¥BÊd¤$óÁ§I©+8Ú¿Â9l\>-I<ÖVÇ\SCq)‰ÑOE7tM"±-ó¤Uµ…6î\ŒŽk7dmËЫö?²Í¹Ih˜ã´ô«ß±^FèÛŒŸˆ¨­£•Œ‰*~ï<1õ¬©ešÚà£v=é|z ¥~…Íb²3)>Y9ϽcjÝÆ¢óÛ6sžõP3 €qšÞšiYœµZo@Ï(꤫vPä™ãµ7¢¹šWv žŠÐÑûe°ëûÎj•ïúÑV4¦ò§…ÿ» ÍDõ]OdÐTg¼æ­¸Ã{VM£\Úiïwö càyL8É?…l ޵T?†Ž:ÿ(êRÏ £r¢CÀ,õ®~YÍÜI›9$î cÒÜ®ø¶îÁõ«•¼…,VvV$òI'–cWSálTµ’E †1ø×o˜ú×0£‚?Ù®—Ä2ˆtkK@@Žá\Üc &yùN+†ƒ¼oæz²Vv12r@W“Ûúf²{š-„¹”­ðÚq…Íh‘Y7­–‡¦vŒ~5¥‚XA Î9¨¾£¶„ƒ“Éà×%â'ì2ý¦Ýu!ù‡÷Mu¹ÁëRWŒ£.Aõd=ÄY8\– s_JÖŒ…9áå#…³¯¬N™|ê§9È>•$oû°TŒõ9åªZ-3T3t¸OANŠâ Çbgß­eù¸( ÇSÖŸ¸2ç­IF×ÚÔ3Œ~µú‚C%³ÁéÅbK+‘òœñÍEœ×‡¸CÖ‹uy-ìÇû™ÅY²Ó“`i°^{Uøl!±·y§!w'­rzî®o® p1ËÀëV®ö3vgCs¯iVl"DóˆãÖ¢‡]Ñî¤ÄÑ4#ׯ€Iäö£«å"ç .Æí|Û+¨Ï¨¥:åbÑ´ùfžàÛò¨<µyîHi9#¯4rŽú <Í<òJÝXäÔb—ŒbÞ¬‘ÊC€N;S8§wëACsGZwlÑA# 3A u  QIÞ”ÐI@Í/zJ8ïHG>”¢€Žôc4”¾””´”qŽ((¢—ŠJ:ÑKLŽ=©)Û}èô®à‡tÈÿ…ÐC/š¬ ã=ªÎè¢,…²XÄ<ÂNZ=Ä1Åb·:%{jÂ-à™FIëÞ¤(×c …p3¹»Ôp®©} Ž=êØ…ç—s8e¥AGRš4¤´ddç#ŠÚ±‰–iy+Ðf¡$@Î;Ö¥»\´6ðçÌ‚©õ¬jLë£MEݲ¤WÓ}§ìaómÌv>µ¯(û\O×r ÖÞ£§&•¨Ý*>âƒkëßÏêÒ†–5ÏÝQE?‰4*¿ÃÔΣ>¼ÑÚŽÞõÖp ªe(&·a…`…ö¨t»0"ûC “ÂÔò¼®zú×=IßCjjÚ™úLÇéúÓ4ö‘^~¢¥¹ÕD†MêpEZWˆžŽç©iÓié¶Âs¶u2¯b5ÖJNFGjóÏÌEæØ_å‘7(þë d~Y¯D—;CŒŽ”èiÿ˜©4Ÿ)Ï ä/›íš”vêq½u™X³À?•p~{Eewt[2»`Tb^–F˜(&Ü™KW¿þÐÔ$•Nc\,`öL}ÒqÔhè)ÙÄE³Î f¢’I×»1%Èb)“K/ß4Á]}P#ž´ên( Í^±“å’,ðFjK”™Oàh(²§düz×]¦Ëæ(É$f¹ Æa[UéÚñ?(G Ô44Í{Òì"¸„1.Eˆ«¶3æÀsúÔ˶¶©Ä›¶Ês÷©u[ˆÏL:V Ùk"ÊC!ê=*AÎMSµa·ålŒóW‡CÖ™-'_ôD—’RAÍcEqˆúí¹ë[^*!,x<’+˜¶ç“Æ8ÅRØ‹ÿ¼—Þ7Ö§‚&ܰ=yæ‹M’q»\š‹Z¸6±,ÉÌcÇÔZásBæçO²Qç*±Ç;NMeOâ'_øò€¢ôÉäÖf<° }sÍ!b‚TÓQ%²KËÛ»–&ââYè ©㊔Üi5ªÐ–'|ÓzŠwnh#ž)ˆozZBpE;µ%'~´w£·4¦Nã’€p9¥¤¥ à÷¤àwâRÐŽ´´ÁÅ8úó@Ï1IA=é1Ú€ô£½qÍÖ€v¤ â€(ü(§SH=h¤¥ü);†>”…/½—ðý)(ÿ=)¯-Œ<9vtæ™5´²IL\tïN·”Üçpã õ5qcýÈLãs\·hôT¶E )v'zg  ºÆ¨À ?\zô¤¸ˆù2#089㊱i0üÜŒwÛÐÎ1÷¬õµYaʼ‚OJ¿e«Í¥Þ ÊÊB–ÏËî? ¥çâT ÀÁ#µ\¾»ûMÙºd•Pбô{Ö{<½ˆ¯%1ÁƒžMssHe”±­ FçjÉo½íÞ²}ëZQÒìåÄÔ»²x©m 77 þ.þ•Sý+sO¶‘‡~]ÿJÒR²9à®Ë…D0ª'EÀVL³n<š|ÏÉ9=y¦ ÜÀ s-u:|ˆeMÀòÍ™jÕ9ä“TîЫr0kZlÊ¢%Ðoe³Ôbd' ۺ׷\J²CŽ ¨?xù3Æx¯g†ü`éóã“ƵJÓG%exŒÕ—Nœãˆÿ*àïWnƒ Û“]ž¹8‹K•IGXù®/Vh¢† E;¶I« OñFø%û¶Ì°)ÄúR`¤šQ »?áŠÐaÉ̇ëIJNN}é+¤æsIKÚ–‚FÒ‚ëÍ!£úPQjD§cþžŒöòôHdŠ»ÄRü³ §i½e|ÞCBÊ oÉö5lG‘åÄ‚L|¬§ƒX1—‡yÕ¡þcP˃Îy¬¤™¹§´£†g ­S.Tç#žkÊà4[Aɧ’yb8qY´_23üU+"^Û³úW91m¨…Éè+®¸ÓçÕ_'æ¡RhÊ_p’^0ùÅiŒ·+XÛjò„0ÛçU¼EÌÑÛ‰7 ÆÜç¶5 VâÃÃ^t?ëgm¾f~è®sO½qûæ%åÏ%ŽMRÑ\ng-£«À¥\—Iœ@g‰„Ê:ãµj5ÜcÄÿxT÷"Â`ÈÂ@zŒpjnË9ãÆsM­‹›<5±3gËô¬¹#11V0ìkTî"3FNr(=(îi’æƒÒŽÔœÐb–”ÓG\PZZSMÁ t ('½­ØPojJP9¥Æhç± ç¦9 œ ^hûÆ€v¥£ë@(é@Ju&hè4”âyÍ5Wqâ’”PŒ;b’—¯n((ü?JSÖ›Ïù4Ñ,k…` ;T€€:ô¨UvÆ;ñR œ‘ëþ¥qž¼lU¼·s&õÕX¾µ*‡’~P„vöþUd<ûsÛüÿžµÒ(R•AºQ},O³Ió˜²:ù\ƒ×]^-¼~²;T‚D€îõcY,ÆF,NkHSosž¥n[¤:IL’c’M74”ª¥˜(êOѱÇrÕ±¸› Ú9bkq›&™Kmh" ó¼}i=zW-GvtS×mÇß¾i‘õœF~´¨¸8çŽÔ‹ÜŸ3#<Õ[½Ädžžµi‰-ÇZ‚åN¦ž¤Ïc8FÌĸÍzN‘<·Þ´x¼–Ì2¹ëþs^q1NŒÖº Zm&Wˆ6"¹‘ÅjÛVg3ô7/¥y[Éfùm·JyÏN€×*Ò™&,Ü“×5Лäk·sȤ1õ®põ®u.i6Î¥H$<ŽzÕ-N|"Â>¦®©V=Ü›î¤>‡­5vMGdAEWAÌ(éKMéE.x¤¥“ŠwAŠe`úS¨ñ\´ Z3IžÔ§¥Ýãû´´gÜÓtÜÂD£éUÖù#$–ÏÒ²¹Îõ‡²GKÄIšÒjªÔ>æ³ç¸yÎæ'1P‘ÞjÑSH‰V”·‚)pcƒš£+KK¶//œÃäN™îj‚/› QÔšè#Aon‘(è9¨¨ì‹¦®Ç± u¨ÎsÖ—œÒU²¼ãֹޛ Œãšr®IÒ“i2~4«ÇÌrA ´/sÖ ˜nÉ©‹sþµ5ˆ óÅ™lfºÕˆí 2î_ÖžñéÒš ƒôéZ7¡.¥ée‹ÉHaM‘ŽH=IªØÉëš@ÄŒRŒî¨±¦á+yp»gµa¹‰=I­=JlFˆ;ÖgÑMY\Æ«ÖÁEUQEŠ?Z<æS¨¥¦ôúÒæ€ÏŠ:qÖóE”§ }©(  Q_2ñ(Ü*ÌW(² mØ££=k2ŠVβß]žá£·”a äÖgˆeY¯†Óœ Î=k5.eˆpÃÚ£ggbÌrOZIY…Ã~ÎiõB àc­%'SKH”QŒŠ>´À3šJ1ÆsG| (£ð£ŒPsNÚJX〽7ÚšJCFMS²(4QޜŠëEfƒëš;ÑIŸzR8ÎhŠqÇqM4”QÚŽ¼Š (ê)( ïE%¼zÑøÒu¤Çµ0¨¤j(¤G\Rgš( ïH(¢€4´¨˜g#îôÏ­iõ;W4ß¼tSøHù'§=)ëœz(¨fÈcôœzQEº‘Ó#¢Šd>†›ÚŠ(Bbr~”õàŒÑE0FMëî¹ltUj(®•±Í-Å¢Š)’fŒQE¨¢ŠZ1EQÖŠ(Àsõ¦ž½sES¨¢€RQE&8£úÑEqAéEŽ3Nã½P:`P:ýh¢€ƒœR@¢Š <Ñš( ‘½hõ¢Š¨¢€ÚÎ(¢€ 0OQ@ Ž”QE-%PÚ—袀µQ@¥h¢€y¤Áÿ"Š(ÿÙRmpfr/build/0000755000175000017500000000000014136173546012603 5ustar nileshnileshRmpfr/build/vignette.rds0000644000175000017500000000053114136173546015141 0ustar nileshnilesh‹RKOÂ@^JEÁÜŒ‡=ÂakâÁ#‘p1&¤ñà,íP6ô•Ý%•›\qZ¶R &$ûšoæûæ‘ýèB,b7,b5ñÙìáÑÂ}]Ä&m¼ïß8ø‹ät¥À›>>¸.ã3¥¥ã%¹‰ézq6—,[†5ð&JC7†ÏŒ%©†Ò±¯|[² ÷µñ< åL E´¦Cß_I®¾¤q¶Ò\‹4¡¹Ð êÑ ÷—<Zæ7ä犀Ü-E$!Åbú.eëé;ƒeŒ•\­À©gÁü¸óxÐyáØW¾û¦&â²6Q]Ì¡^©¹Õn˜°³z+§ur|ÛV”ð”q¶ hEUÀ»ÐFs2›g£êã|$2æÅ+¬óT¢½Ÿ¨-ÓÜ©’u‹ú…Çf³ù>¬È¸ª*ªÀNÀ5wæùhýüfÝ ‹êRmpfr/build/partial.rdb0000644000175000017500000002456014136173474014737 0ustar nileshnilesh‹í}[wÓHצˆ ‰ œÏðV;MÛ†Ø9h: ä¡ I;æív7¯,—m5²ä–䄼¬ž‹¹šÿ07óæj~É|wß_˜õ­5·ß;µ¥-»|PˆQ´†d-åÙ‰ÊÞ»víÚµëü~D„áø±a äyöë˜ $¯¶ÿ8cáq!ÉðT¡Þ¨è¹†(}«TŽp/OÊL±Ê(þ#Çß-žw§4tI§Æìüe3†Ï#}¾ëSCìSY¡ð¥‚ýó]I˪ÔÅðíÖJîaWºaªJZYV«]ùë›xPëÔèúÚáåÖ7ÿÙõ¤)³˜b½Á$: /þ÷ÿü¿ÿ}fæß»¿YRDÃùæ'›뛫ï%ÓÑ•õ§Ù‡Í0(dëíé¤YoLد‡~|)U' ¥¦¬”gîÏ>(=¼?{oöþìLyÒ*Éɺ¨Nv”i¾Pîb3°Sîbpgÿ l±Ñ“ÿêú&®HÝ’´l…ÿ¢cÝ©‹¶"àåÀ¿º Ëy.´Ò%XºãÿÚ/Û;96â"Çñ­å÷[.b\äbì·ZöŠÖ®ˆ¢AY#^@Ú—†úr=QY4\øCäTuÉûKâRÉ b-ðT" ,À“HŸŒ DX €§>}‰ûÓâR‰ }¡–¸-Îâ¤Ï„V&ÃŲ&mí6úy°ãX€g‘>}©ûsâR©Ü+µ•É‘µ¦bÊ …’ J²!k*YQ4ÑdMmnC“U“(³ß’âµ±&Î!=b­2eSéW~ƒXf€~}ùûÇâã³ü†ƒŠÏiýWrþí÷„X—4tm[.SƒlÎ+Èb¤¨–Iš5­lЦQ—Íû‡,yÞ‰T¿GúûÀÂ?%DV%¥ Q%1uQ5$ª–©jРɤŒ«¢’Ê’JS•LV/œ\”d–Xßõš‰að)ÒOgâaºw*n+.iXWmÖKT7&Hê”h“ªD…–‰GÙ“(¯Åé¾y »‰°L(çU¡IT$à2ÒË:JØjΣ@#¨ÀQ¤GCóxCÅòOMÍìçò’X/€ñI¤}0šxœ'dK#fM6«D6Y…1©^%V½MxEÉë¯ÓÌ¢¬æ$ã´&^Ë$?…øé—s°B¾ÜªeÉk¹õ™ìÔd©Æ2iP¥BXžK¢Áò¥©^ó½°‚ôJà¼LKÝ/Ö6HæÅ›·}ÚíVNò^%>‰RN =šáž,²†AÒå8Q—¦ C_¾ûuƒ 8À!>>}ÜTPqNcmpŸ€Z¹r›ÕifFKË›‹…Õ­Õõ7æÜœÎâúÚÚò›~ŽaQ^AúJôÅì¯rˆO@1ñ(ÇTÁ¡£«íSgpj©¸I?5ô_uj°únÌëå Ãd½©ykè·Ï¦¦)ÆÜÜ\¡üûY¸¢Í¤Æ§SÙ¿öÓ7N¾Ý\.¬-,Ö]ò–@¼ô ¯yë䬋’®u%?_Äxx?÷ÃÓS©l6yû)9A°\˜î ²Tõ2ËFj-ÏôOR/©\¢z•/£”d–Ø_–:æSz½ö̤uÖmÎÓr3“"»“„ŸvY¤*šÎ ê%ý”a¹ºó\VÙï%*¥bR ¯;Šá•VS¡ í2x#57õ«ìÝÒ³¦fšâŽ˜—ĸ”ÀLw Ôþø¸Ö¨è M—«²J´ iª²®if!“KI¼ï(‰—¢j@Iül—ÄsM—jì¥[iÔvJ˜âYUÓªŠõïD‘™–aQL&,Òíå>–ÙÄ#_+Äu¹áké//´‰¥£ùýÿ…Í]ƒu ôϦ¬Sˆ-Œ£f€aŠTë ’y2Ofó3ù{,„´ÖZÂ?îå§òSqéá>m”+’®1Q¬oáÞýôZÞf~ƒUMÝ.Ö2¬9Ô©µôŪ¥ÛrU¥¦I£Š—Šx¥·"ð·b²V»¹áÖN:MKLêåóši6Œ¹ÉÉ<¸Ž¼¦W'³V¹gÉb…8å#ã䃹C&™‹ bPJÈ“'„––Ö–óõr,Íôkt$É%Ú`òQ3oo¶šñ©üƒÜ4³Ü¶á÷YK}•6»ZohúQèi½½D`v‚uÔ›¦¬0À‡Xjæk4Ö‘ÍfµJ#kµÞÞ#k ››ä95 ªL†¦ìªZ…£.’ån§óS¹Ög"k¢©ËŸb©¶¯Ñ”O;¦|ÔÕÀ·OМ»ÍxŽhª²kmdu:ÏКçëH›9kGI,5ø5ZöȲZU‰9ix{†”+Ö|!3l]”êb,uò5ÚéiÇN=Ç¢ƒ*eØÐµ?¨dZƒe±TÔ×h·'Ÿ7«z4Ìà¼m›o_Ã5Y ð‘ê“O«ºÖl|Ëó÷>ˆ¥Þ¾FkN¾¶—™²›”^l¼¶fŽÆtãb¡#ÎÁ£G& o wbkÌ4ñ5Zç°½ÉãÈ6X?hïë ήò«Ø4'ûÈo$óØ 4]’ËVhÐg[Ä“¸,ˆyHî… kyÒÚA~•ÌËËn‚I[ÈbžÀÞGê/¬À‹ô „À²{òsž8ëít¬Vç«w¬UG6NÞ¡–Ê"Џøì“k¢¬šì¡G~Þæzüöc÷ nOb©°¯ÄŒûrci*â)R´ßÊx€=ŸþäcISUj-±âòpÒ~¸Ê¼Ù~–©÷󿏣©CÁtÒBk£TkÅm<²±b/ ùÐSöÿ¹Ã´™U¯ª&…Nͺ^f¿Y¶ê_:>8Ò¼Œ—ŸÖæ4#‚.­Ù»ârÖ?Þø­¿Sø:e-ÛNÕßà_¬RPNÖÿã‘“y7•ë´ 1†³ýÏʉ¨ëâ®A*ºV‡í õxda±ãr. û?æ/ùÆ­,œ½ ñó±e4ýÃ6 µv%Xh~bþ|$V+a‘¥,bÒT}Éóí~'­x[x­²×ØoÙº¢)ж•¢uz®ÛåßÑ,(\¸»¬©ÿÿ„yLL(Ü{µC“Ë’ç|¼ÔÔ­ž+Îv•Mƒ>ÌLMOçÄ‹\¤,,®/-Gî‹’V¦ÑÙ2‰¥3qÛÑt0J¸AÀ$rm“`#ÉZS—h6–úùšü]wENâ‚ÝÕ£š?ËŒ¶æ>m-k’Y¯5PfÏ]ÙAÕŽlÖHÁ¹î;}G•;¦•û”3™S5ÓírÒ£ þÕTðÅV¥fõÛ®Öвg£í¹è|6Kr9²Ó.p%Pi÷¨’Ǧ’÷åº×äƒå|üõêæ–Ë7„´á˜ÏÀÕöu ž³Ò´Ÿ€b¬nu Id¬}® Ö®Y"[›_Ë5óÝD§08IÌšh’Jº¶-—)ñ˜l+,\Ez5´Vçx]Tw}H´¸‰ôfˆm ­7j.l_!n!½½yû·âPŒ|ÛóRç‡T[ûP¹‹½Ê|í0t> õ³¥Akµ GÑ.²çâY¤Ï†hLЬ~ta;„xés/]Då_:*v@㘠>´~‘£C6ˆ¡²ì×$Rˆ¤3Ñ˜Ä Ä,ÒÙhLââ¤ï6‰KöšU¬³øq‚° &þ|”Ä]ÄgH? = (\x/ >Gúy`½ § ’Ùœõ|13H±ˆø éWáµÂ0‰æf8n]>0”!ĤGÞ^/Ùò[8Šôhàr'Ö©·$c ZÀôuýý$ÑnVñj¼ àIÄ<Òá7zæîËÉTŸ#í˼½99`wqéÅhŒfq é¥ÀF“ð~°Œøé¹×óÑ*²a:ó—ô“KÖŒ¼W/c­¼…ô­À2ž[(—eÓZy‹rCóZ¡® ,€\'+ì(ÒZÖåC´¿!Ž#=~ðµ‰ë¦ ß"ýíÁ×&`wñ6Ò·È ûŽošÿñ.ÒwCkOS]g"§äC¶YĤB+ž¡bù§fk¨¶‡ñâs¤ƒÇ.ž½ð_D\B:¸Û½+AëšNíkIy¿çQ¾«v‘[x ék¡{”㰄ɇdiÄ;HûŠÊ½9`÷ â]¤}Õ&oØ]Gœ@z" ‡²×õ=4ŸCœAz&°,Ù ®:‚É{y‘¬3›u–‘L‰*ÚNÖscÍ™­Õk<&øì5•ºŽ¬ gÐóÛÛ·ÉÚÚ‘´&\d®ïZÕžÖÍÙöø”â6z8´¸¾¶¶ü¦Ÿ°7P@Ào‘öÕlÓ°¿Í!>Q‹q5à ÿ¢Ã5RýÇb6àèZÑëB)ˆ?O!žGÚ×€•‹CrëvCˆ¾Ü!Ù#õ>TpñÒ¾)”4¥ßZT.òçkwÐÂ󡜷°†ÜZ§âúz ©€]ñ<Òaz0— Ø%/ ܃î\ƒï£."¦„Ö@»OÛܸ»,“®ãˆß!ý]`¤¾¸ïÚ–Òˆ/‘~º–\VAÓUÄ‘þ1ú˜Ø¿æŸÈ½Ù7‚íÁΛ%[”}ˆ7†xéËïÒ€]ñ Ò,öv ¡ÝAMa¬ïHúõf Æ5ÄÒÑy3à:Žž7»½¯|(*ø#Òþ|Ê^ŒAÑgzXDºM* þ†ôoÁÝ[&ë&ˆÛð;â¤?DS“_#þéoeü¦È!>Ñ´´À´„XFº}K ì)‡øDÞÒ¦»u<¸–v¤}úŒùƯ f›çâ)€]ñ*Ò¾ÚÄCŒpäØ%#¹v ÄŒÜ×NtÎ ¸Ž#†×ÎÞÝÿýw~Ô•Fü i팷L ˆ[H®+`ÿ–Ãpv]ywkß ¶+<8·6ÊÝMèCÀ1Ä«H‡9`áâØ€]ñÒa.’pqlÀ.xéà‹$†ü¹5âb éèÜçÊBtk<Þ‡ÉÝ8éG}iDéÈFƒi ñGƒ=åð°FƒÓ‚íÚÎͰï°ó!Ûâ¤}­¬ðæá€]ñ"Ò¾¶LzópÀ.x éK-âd€U$ Ée¡=¢yYˆÒÍ9ƒާÇÍ]q¹7ÑnœçI£ñaÀì)âÒ¾¶;óaÀþ9‡øDîÃ2‚í·· Z×Rúm ñ<Òa®IsqaÀ.‰xé0=§‹ v Ä‹HûÛlο=d%ˆrIho/¿$DéÀë8bx>,Ù:¬Ú‡2Òˆ“HOª(|ªD>Ÿw³·e ÉćH?ŒÆP§@ú‡Àårç‹7Ú:wÆú)¸9D i)ªÖ˜–+HW¢om€}•C|"om²¶é[xp­ÍHû>_ò!F¸~Ø%¯ ‘­Ÿv ÄÃ_?R\GL Q¯Ÿ®ãˆáµ63žïö£µ4â{¤ßGåÝ€éßEú×è½°/rˆO@1üM1Þl¯vG8Œ)Fà:„ÞãùÞ»Ãý¨eñ&š©¿ Á‡™Ó[ˆLp+x½™ûo8œ·ŸÈá»h–€×Ÿê¸{܇ˆcˆ×‘ö5bí­vIÄHß8øvØ%o"íoó`;?ð]¬*€)¤£s_Àu\h‘ŽûÊî÷¾{?ÊJ#®#½•S¦ˆ¤ Ñ;5`¿É!>‘;µ Ávd€س°/cñáÑ@®1¡}àID= `—DŒ°g숇߳àë8„žpG ϩݵîJ„;š .³†å3öô¢ãͲ~bƒ iÄÈWRÓâ!®¤öo9<¬•9Áve€çÖ†ªÔ„VЇpcˆ‘s²Ïŧ»$â%¤}MöyóiÀ.xi_‹á:±øžA® ¦ŽÎ­×qÄðÜÚçÏqÓ‹0ÜÒ6©åó&Ø¿dÕ¦àÒRÊK#~@úCTN˜þ±„t)z'ì%ñ‰ÜÉåÛ±œ“K¶n’õ!Þb„«`]1ÂU°À.xi_c8«`AŒkˆ)!êU°Àu1<'—ór{±…¥7‘ö×!óáØ€éâ;¤ßEïØ€ýÏâ¹c›lgx€ÑÞÊìC¸1Ä£7`—ÚG½»b,¢7ä bôÑpG ϱÝÜë&p? ÂEÖ‘¬iÁç!Ü~0]B\Az%zGì_pˆOäŽlJ°àÁ9²“ü½æ>$C¼†t˜Kë]¼°K"^G:̉ oìˆ7ö5QÑuò£G2ÜDL!#®ãˆá9² !™ÅŠÁ ‡™mÏâo6ëÙ–Eì¦úÐUñ Òo¢òiÀtñ'¤ƒïÄõìÓ€}C|"÷iÓ‚íÇΧù9V$C<'Dv$°K"žG:Ìõ¶.¾ Ø%ãr$Èr1%D}$pG Õ§m6¨Nl¿:­½Ò2Óž×W‚”iÄÈ}0]G\0}‡øi~•ëÙµû¿sˆOä®í`»3ÀƒsmCµ?>ú˜Ð¡Æ#œžvIÄKBdÓóÀ.‹éyä bJˆzz¸Ž#†çÚ˜kÓ´4÷ŠÒmj%Ö'Ýf^l›æVtJÉš¬¶ýZdv4ý#Dr°þÒ×Ð0ˆŸF¬"íoÛ¹gLkˆ ýGôÎØäŸ*Ô0PSû)ào‚íÒ¾GÄ'jûñ‰ZŒ‡¨ÃÑÆü Þ˜*«öÖ ¨:²AÄmQVÄ’B{Î+š¢h;P›œËT Ï— þ€bÎ#=ï»:A9ôk¯¼_2ûiGƒ_2x&hIƒ§9Ä'òðâÑ#!¬ð‚O•´ ä«nm­Û¹1 Oñ,Òg¾‰v ÄsHŸ îü”Êyñ‰¨a®/#<Îù±µ›UVvÉ‚$5a„,jõFÓ´}ÒŽlÖHaŽl1_”¶L'M¢ôQ¬R’1´¦.Ñ Ò(W²>Ôy±„t)ª&˜Jˆ‡xk°¯pˆOÔb<lã`8-œw¿Ç5Mà÷N)ZuºN?5rpI¹Wß2%#<ŸØ%/!í«WÌ÷ûËâ‘ï®W¯#üâUðw¶Ãc¾Ïvyf13ÉL“a–’Ég³$—# pÁ‡AËp; ½|/ˆçƒlÜ@,#íï0\ž˜RÄ*ÒÁôòìr€}C|"èÜÌ ¶cy"jçØpè»s㢀25YGÂèÃù4fúiàÞŒ–wU±.K+Š&u ¿ôD=ÝfK-Fñþr‘hq}mmùM?Å=Ee=Å Øuùû³âR[5¶&êÌ‘5‘J5…ê…{&Ø `øs¨CE±iÖ´~•ë=ःϢz.`•C||Ω â,`¥pŸ€ZÉá¡Ê™µÖEz9û"½Udk áµ\‚“j²^E~Ž…˜C:w!á"ò ?$¼X3͆179¹³³c•ž×ôꤛˆï– Ï]DF¼txg?/6uÅ…kñ&Ò7ÐÒm¢é´Â”ÒR!™&ŒR™MÕ–`\ê¶•ìŽq‡¨”– ë)¦Ç”[8´‡O‡LÜB‘£wÀ¾Ä!>Q‹±„vî`8J†ÌSd^¼yÛï*Nů§XF ¹3Á#÷+È0|OqÞñÕzƒ©ÊŸÁ†¯!ÞF37?܈á]áâÙ¦ý ñ‰ZŒh†Sµ²Ä:–Õ Ôò‚­qzR§*Œ¡±Ž£XÒ¶iÞ«¸/QDÀ,ÒÙÐLf´ÈÒPvÛöë', ÃÕPuå¹È€ý‡¾;JV½>TœW‚=Má >µr‚Xã«eùKåGü;]!$  .¼‡‡‘¬‡dkhÙ‡*’ˆ¦&ö\‘‘`Þ߇`yÄ)¤§B«ÂüjŒ¶ å°*NS»Ä?ÍÄŸ+ÉUÙ¾^ÊGNn!r§}úËIÏ7_AœFz:D¹Œ­»sˆ3HÏ6á‹Öª¦e‚j†¶Á«—‘î!¾@:øöý „ØD…¨xÄ_Æ£d¯íjaá¤ýmºÜ«¢2ý9¢úð;Ä)¤¦Âý+¸{)¿AZ÷c‡P©à¯#N#A¥vg^©F³¦"k²T#>4|qiÿkº u°àãŠ5eñÒ¾j·KO 5µßÃõ âK¤_FÏûUñ (Æ!ª¶CÊ´AÕ²á9Ð^³‹ÖÂ1¤ÇB+‘á"눊¡¹Ä“Àíp¨Q6°à0X”}v¿â¸N·® öŠ ñ ¨–ïÇÇÉ[ë>ç¸!µu•°aR± —oê´ SGΫ|ÞÕš\¥ßÀ‚tÑ}Xúqu:?sŸ<Î=sº ô¹ldžÌÜœõ,éO(à8Ò¾ÚŸÎîŒ%©ga (@AÚŸ f|›ÈÛÁpêä+f|0L`Ö¨JRt›ê»fÙbŠüÑ4Lkf {µ "”©!ë´L¤šf°ô­Ã™çjrÕs†¶0€ŽÃy8Cl{üH™é¹ï'ÈÌÔ¹7•%,Ÿ•¦¢ì¢Ðô‘´zCÔ©•;Ï¿E ý °ð7plsp‰^f#Ó˜Ÿþ!ëYÄw(à ¤ptËUŽŸ‘·ƒáî(¬„°ÊÚ»fÞ£€£H÷ãÞ5ówäí`8š)0S߬±¸CTRYÕm_ãl«P«íJ‚ɺvƒ“™&ô“D­nú1u¹*Öë¢wÿ‚™äügÀŒ]©Ró…®5kÔ7“‚“_RÞÅûEŒ`BØUŽ"òv0œò_aåÿ3\Ê­mËeJîÔEu÷uVÞujÊÒ1ðàÇ.&¬&@³V~×í[ ]Ws»fæ7Ì 7í03· fÉx“bFRDXóÄ ;Pò^ò¿£`€·¾<ÚCÈ]w}Hú¥ õe›,ÒOb½¡ôc_GvÿÕ,=GÿÀ~€Ã`ÑwyÇt= Á#ˆg>bŸì#ÝeÞ¹ìÂùâY¤ý &*`ŽC|ü) 'Õ@¡_ÖŸf[ðcâ4¤àV‚Áÿک뢤käytã ôçm«ìøô`Ña Íùúc';³ÚJh/l%;Ý'Éñ"U%.Íù®÷|ím%ìJtÒÜœµü—n´/Ã¥r§ì]ﵦٛ·Ž4CÅŠ\mê”Kv¡[ÃES6>Åñ-Ú#x­Ã= ìuÒ®ß,²NФË%>ÑÙvYôÈ=X¤õF­WAýžŽŽ eÖ_2¬)Ö§»­j´h4K•ÌÎdÝEz¼X®¨½Bt¤áFløì» hÍ‘íihÉ¢±«j C6:sГp´¨ÒÖab±o'—{•¯©0ÉÌKwž*².˜½½Ì¤{YÝPÑF:ÕÖ#ۉⶨ4ùâë—jœªe¹Â¥ïSë¶ûWà}Ùà ³¼?ù2ì6ÿ“hš.[8þÅ/ffVÚ³zn‹¼OíQ¤³6²›g—"EE¿d ¬ž[e÷…/dî £ªºä. ÎNƒ3V÷Z=T4L]ëHâRM»c­?ù¢O†šÕ]C‡öñý'ŠJY3yîq¢^mÂ’ >ÕX¯éô|M³SEî«rQÄnrsv_µ‹iÞÚT°Çw1Ÿ,ÖùÝ>p„1&vxî3=bË&…CS:ÓôJ4.WÔ2å«rªG¢šÞ‘àb_Ãg¡»Ðá¬\¬¼š¦*»ý÷1 ZeÞøú»tˆ9ÔÝúµwÐÒ —à\_KßÛ÷ [™Õ›|š^«u»&ØÕ6ð+vöt ÃÅ^ëíÍnISºô±ÊòOÍÎ@ ×é_J¢ yÏ 5ik·A{óµæÀž”m}ðT_…`_Üݪ\pûIö+¬ÍK®îéDq“~jðßì«íBy½Ñá Fz5åìíø¢¨0Â$ìé›îíÓ7ɪ|é\êÉ`Ó°zy|œÜ'8+{{”D±#vè' Nqî'ŽìûÀwÞt)ëóEì®.ñÄ€ÃêªK'®3lëôÉ,¿²*c}ç?´dÛį:5šŠiÌëå Ãd¬çKMY)ÿöÙÔ4Ř››+”? P¸¸&“ŸNeÿêÓ‹û›-¬…¤+í^ßË‚ÿ ö •¼ÝZÉ=´_žè~)Øÿ†Ðx[ø·ß¿ý_éÿ–èê8¦³±¾¹ú^2°þ4Ûšéfðt²9YÇ/“…É¥I=×M©FË“+÷fsfs0[7iÔDNÊ“vgrÒØ5˜óÎ;ÝÚÑ3iÖ“öëáƒ_JÕÉ‚¥å™û³JïÏÞ›½?;SžÄùü=»ÎC¬³‹!—[’Þ z;§_vUîÉXuX¼û°QÈŒO÷µ•Kh€ÜF`ÇVè¾G\Úæ×â}ÏeôŠÿŒÞF'ôYaáͧ¿>CWùóg›Ã_ýõÙ&úäqóèìÿ› -IÖËÒªŠ1såÙ7›,(úd•ÏãÓSö»O6ù“J摞÷›Í®¶d±°ðÆrºaäð4~vÖÔÃwç 9¦Å?XßÀZ[înžeô38{+ß}²Œã®!½J–YPc0)h8¦{­_™þV’¤_®®bN§ž b¯}z8¨á-{˜(ŒR}â½5³©ÜÛ1n.•Ÿè ¦‡}E|cŽ~VÕ²lEÛahè™w É6wñ÷—ÿŽôï¡ù¶v4´¼¹XXÝØZ]Ž.|Ä>œ îúàö õ‹}ö¯=œvô°€Ã;a¨à©wØ£Kî¹Oa޹9ÏüáqÖA“ÃÉ÷ûÏ·¼0Æî9žÄ\r‹“–÷9§¼×DYe½-•†Tæ‹Þ˼ÞÁ] ·1ç€e¤Ë¡{Ê®~SÔäàTooaßa=ë)¨“xú•­ÛVo¡é4t k•@‰Vïæéÿœa¨[„3½ß)üçÿ±zoèuRmpfr/tests/0000755000175000017500000000000014136173457012647 5ustar nileshnileshRmpfr/tests/lowlevel.R0000644000175000017500000002410513523623603014615 0ustar nileshnilesh#### Low level stuff - debugging etc #### ========= ========= require("Rmpfr") options(warn = 2)# warning -> error identical3 <- function(x,y,z) identical(x,y) && identical (y,z) identical4 <- function(a,b,c,d) identical(a,b) && identical3(b,c,d) ## sane state [when re-source()ing this file]: .mpfr_erange_set("Emin", -(2^30-1)) .mpfr_erange_set("Emax", +(2^30-1)) ###----- _1_ mpfr1 , import, xport etc ----------------------------------------- i8 <- mpfr(-2:5, 32) x4 <- mpfr(c(NA, NaN, -Inf, Inf), 32); x4 # NA -> NaN as well stopifnot(identical3(is.na(x4), is.nan(x4), c(T,T,F,F))) o1 <- as(x4[1], "mpfr1") stopifnot(is(o1, "mpfr1")) # failed previously validObject(o1) # ditto (failed on 64-bit only) stopifnot( getPrec("0xabc", base=16, doNumeric=FALSE) == 3*4, getPrec( "abc", base=16, doNumeric=FALSE) == 3*4, getPrec("0b1001", base=2, doNumeric=FALSE) == 4, getPrec( "1001", base=2, doNumeric=FALSE) == 4, identical3(mpfr("0b101", base= 2), mpfr( "101", base= 2), mpfr(5, precBits = 3)) , identical3(mpfr("0xabc", base=16), mpfr( "abc", base=16), mpfr(2748, base=16, precBits = 12)) ) ## save initial (Emin, Emax) eranges : erangesOrig <- .mpfr_erange() ###----- _2_ Debugging, changing MPFR defaults, .. ----------------------------- ## NB: Currently mostly *not* documented, not even .mpfr_erange() stopifnot(Rmpfr:::.mpfr_debug() == 0 # the default level ## Activate debugging level 1: , Rmpfr:::.mpfr_debug(1) == 0 # the previous level ## and check it : , Rmpfr:::.mpfr_debug() == 1 # the current level ) r <- mpfr(7, 100)^-1000 r ## (same as without debugging) ## where as this does print info: -- notably the very large values [3..6]: .eranges <- function() sapply(.mpfr_erange_kinds, .mpfr_erange, USE.NAMES=FALSE) ## now, mpfr_erange() works with a *vector* of args: .erange2 <- function() .mpfr_erange(.mpfr_erange_kinds) ## now returning *double* - which loses some precision [ending in '04' instead of '03']: formatC(.eranges(), format="fg") stopifnot(identical(.eranges(), .erange2())) .mpfr_minPrec() .mpfr_maxPrec()# debug printing shows the long integer (on 64 bit) ## Now, level 2 : stopifnot(Rmpfr:::.mpfr_debug(2) == 1) r ## with quite a bit of output if(FALSE) # on Winbuilder [2019-08-08, both 32 and 64 bit]: .mpfr_erange_set("Emax", 1073741823) r2 <- r^100 r2 L <- r^-100000 L3 <- L^3 str(L3, internal=TRUE) ## Class 'mpfr' [package "Rmpfr"] of length 1 and precision 100 ## internally @.Data: List of 1 ## $ :Formal class 'mpfr1' [package "Rmpfr"] with 4 slots ## .. ..@ prec: int 100 ## .. ..@ exp : int [1:2] 842206477 0 ## .. ..@ sign: int 1 ## .. ..@ d : int [1:4] 268435456 761715680 1492345294 -1000766770 str(L3) ## lots of debugging output, then ## 1.00989692356e+253529412 ## ^^~~~~~~~~~ 10 ^ 253'529'412 that is humongous if(!interactive()) # not seg.faulting, but printing a *huge* line [no longer!] show(L3) ## segmentation fault -- randomly; 2017-06: no longer see any problem, not even with if(FALSE) ## well, not really, definitely not interactively for now if(interactive()) for(i in 1:256) show(L3) ## ## quite platform dependent {valgrind ==> bug? even in mpfr/gmp/.. ?} str(.mpfr2list(x4)) ## slightly nicer ["uniformly not worse"] (still very similar) : str(x4, internal=TRUE) x4 ## "similar info" as .mpfr2list(.) ## Increase maximal exponent: tools:::assertWarning( .mpfr_erange_set("Emax", 5e18)) # too large {FIXME why only warning and not error ??} .mpfr_erange("Emax") # is unchanged if(4e18 < .mpfr_erange("max.emax")) { .mpfr_erange_set("Emax", 4e18) # now ok: stopifnot(.mpfr_erange("Emax") == 4e18) } ## revert to no debugging: stopifnot(Rmpfr:::.mpfr_debug(0) == 2) .mpfr_maxPrec() L / (r2^-1000)# 1.00000....448 (could be more accurate?) stopifnot(exprs = { all.equal(L, r2^-1000, tol= 1e-27) # why not more accurate? all.equal(log(L), -100000 * (-1000) * log(7), tol = 1e-15) }) ## Now, our experimental "transport vehicle": stopifnot(length(rv <- c(r, r2, L)) == 3) str(mpfrXport(rv)) str(mpfrXport(mpfr(2, 64)^(-3:3))) str(mpfrXport(Const("pi")* 2^(-3:3))) ## and a very large one mil <- mpfr(1025, 111) str(mm <- mpfrXport(xx <- mil^(2^25))) stopifnot(all.equal(log2(xx) * 2^-25, log2(mil), tol=1e-15)) ## even larger -- strictly needs extended erange: if(.mpfr_erange("min.emin") <= -2^40) { .mpfr_erange_set("Emin", - 2^40) show(xe <- 2^mpfr(-seq(1,70, by=3)*8e8, 64)) ## used to print wrongly {because of integer overflow in .mpfr2str()$exp}, ## with some exponents large positive stopifnot(exprs = { ! .mpfr_erange_is_int() # as 'exp's now are double (ee <- as.numeric(sub(".*e","", formatMpfr(xe)))) < -240e6 (diff(ee) + 722471990) %in% 0:1 }) } else { cat(sprintf( "Cannot set 'Emin' to -2^40 (= %g), as .mpfr_erange(\"min.emin\") is larger, namely %g.\n", - 2^40, .mpfr_erange("min.emin"))) } ## Bill Dunlap's example (with patch about convert S_alloc bug): ## (precision increases, then decreases) z <- c(mpfr(1,8)/19, mpfr(1,32)/19, mpfr(1,24)/19) cbind(fz <- format(z)) stopifnot(identical(fz, rev(format(rev(z))))) stopifnot(identical(fz, c("0.05273", "0.052631578947", "0.0526315793"))) # << smaller prec, again since 2019-08-09 e.xx. <- .mpfr2exp(xx) e.z. <- .mpfr2exp(z) ## revert to original 'erange' settings (which gives integer 'exp'): .mpfr_erange_set("Emax", erangesOrig[["Emax"]]) # typically 2^30 - 1 = 1073741823 .mpfr_erange_set("Emin", erangesOrig[["Emin"]]) e.xx <- .mpfr2exp(xx) e.z <- .mpfr2exp(z) stopifnot(exprs = { .mpfr_erange_is_int() e.xx == e.xx. e.xx == 335591572 e.z == e.z. e.z == -4 is.integer(e.xx) # but e.xx. is double is.integer(e.z) }) k1 <- mpfr( c(123, 1234, 12345, 123456), precBits=2) (N1 <- asNumeric(k1))# 128 1024 12288 131072 -- correct str(sk1 <- .mpfr2str(k1)) str(sk1. <- .mpfr2str(k1, maybe.full=TRUE)) str(sk1.2 <- .mpfr2str(k1, digits=2, base=2)) str(sk1.2F <- .mpfr2str(k1, maybe.full=TRUE, base=2)) stopifnot(exprs = { identical(sk1 [1:2], list(str = c("13", "10", "12", "13"), exp = 3:6)) identical(sk1.[1:2], list(str = c("128", "1024", "12288", "131072"), exp = 3:6)) identical(sk1.2, list(str = c("10", "10", "11", "10"), exp = c( 8L, 11L, 14L, 18L), finite = rep(TRUE, 4), is.0 = rep(FALSE, 4))) all.equal(sk1.2[2:4], .mpfr_formatinfo(k1), tol=0) # not identical(): int <-> double identical(formatMpfr(k1, base=2, digits=20, drop0trailing=TRUE), with(sk1.2, paste0(str, sapply(exp - nchar(str), strrep, x="0")))) identical(formatMpfr(k1, base=2, digits=2, exponent.plus=FALSE), c("1.0e7", "1.0e10", "1.1e13", "1.0e17")) }) ## MM: --> need_dig is fine but is not used in the string that is returned !! (fk1sF <- formatMpfr(k1, scientific=FALSE)) # "the bug" --- now fixed! ==> new "Bug" in new Rmpfr ???? ## was "128." "1024." "12288." "131072." , but now obeying internal precision gives ## "1.e2" "1.e3" "1.e4" "1.e5" (fk1 <- formatMpfr(k1, digits=6)) stopifnot(exprs = { N1 == as.numeric(fk1) ## FIXME: This should change again "1024" identical(format(k1, digits=3), c("128.", "1020.", "1.23e+4", "1.31e+5")) }) ## digs <- setNames(1:6, 1:6) ## Each of these are 4 x 6 matrices ffix <- sapply(digs, function(d) format(k1, digits = d, scientific = FALSE)) ## *not* good at all .. ## ==> need a maybe.full=TRUE even here ff <- sapply(digs, function(d) format(k1, digits = d))# sci..fic = NA -- digits=1 failing for '128' fsci <- sapply(digs, function(d) format(k1, digits = d, scientific = TRUE)) # perfect stopifnot(exprs = { length(dd <- dim(ff)) == 2 identical(dd, dim(ffix)) identical(dd, dim(fsci)) all.equal(asNumeric(fsci), asNumeric(ffix) -> dmat, tol=0) all.equal(asNumeric(ff), asNumeric(ffix), tol=0) }) rE <- 1 - dmat / asNumeric(k1) i <- 1:5 summary(fm <- lm(log10(colMeans(abs(rE)))[i] ~ i)) stopifnot(exprs = { rE[ cbind(FALSE, upper.tri(rE)[,-6]) ] == 0 abs(residuals(fm)) < 0.15 }) ## formatting / printing : tenth <- mpfr(-12:12, 52)/10 cents <- mpfr(-11:11, 64)/100 (kxi <- sort(c(k1, x4, i8, tenth, cents), na.last=FALSE)) mstr <- .mpfr2str (kxi) mfi <- .mpfr_formatinfo(kxi) es <- mstr$exp # base 10 ; with '0' when !is.finite or is0 ef <- mfi $exp # base 2 ; "undefined" when !is.finite or is0 j2 <- c("finite", "is.0") dxi <- cbind(x = asNumeric(kxi), prec = .getPrec(kxi), as.data.frame(mstr, stringsAsFactors = FALSE)) stopifnot(is.data.frame(dxi), identical(mstr$str, dxi[,"str"]), identical(mstr[j2], mfi[j2]), identical(ef, .mpfr2exp(kxi))) dxi ## 2019-08-09: again *varying* size of 'str' rather than only growing !! ## Show that *order* no longer matters: n <- length(ixk <- rev(kxi)) dix <- cbind(x = asNumeric(ixk), prec = .getPrec(ixk), as.data.frame(.mpfr2str(ixk), stringsAsFactors = FALSE))[n:1,] attr(dix, "row.names") <- .set_row_names(n) stopifnot(identical(dxi, dix)) ## somewhat (but not so much) revealing : cbind(prec = .getPrec(kxi), kxi = asNumeric(kxi), str = es, fi.10 = ceiling(ef/log2(10)), str.2 = as.integer(es*log2(10)), fi = ef) ## Bug example from RMH 2018-03-16 : (x <- mpfr(c(65, 650, 6500, 65000, 650000), precBits=6)) data.frame(fDec = formatDec(x), f = formatMpfr(x)) x. <- as.numeric(xDec <- formatDec(x)) stopifnot(abs(x - x.) <= c(0, 0, 2, 12, 360)) cat("Checking compatibility .mpfr_formatinfo() <--> .mpfr2str(*, base=2) :\n") for(nm in ls()) if(is(OO <- get(nm), "mpfr")) { cat(nm,": str(*) :\n"); str(OO); cat("compatibility: ") I <- .mpfr_formatinfo(OO) S <- .mpfr2str(OO, base = 2L) if(identical(I, S[-1])) cat("[Ok]\n") else { if(any(B <- !I$finite)) I$exp[B] <- S$exp[B] if(any(B <- I $ is.0)) I$exp[B] <- S$exp[B] if(identical(I, S[-1])) cat(" after fixup [Ok]\n") else stop(".mpfr_formatinfo(*) and .mpfr2str(*, base=2) do not match") } } Rmpfr/tests/arith-ex.R0000644000175000017500000002070214022105500014466 0ustar nileshnileshrequire("Rmpfr") ## includes ("gmp")# want to check "mixed arithmetic" too __ TODO __ `%=N=%` <- function(x,y) (x == y) | (is.na(x) & is.na(y)) all.EQ <- function(x,y, tolerance = 2^-98, ...) # very small tol. for MPFR all.equal(x, y, tolerance=tolerance, ...) warningI <- function(...) warning(..., immediate. = TRUE) ## Check that we got the "which.*" methods also from "bigq": bcl <- c("ANY", "bigq", "bigz", "mpfr") ##if(packageVersion("gmp") >= "0.5-8") { stopifnot(identical(bcl, sort(unlist(findMethods("which.max")@signatures))), identical(bcl, sort(unlist(findMethods("which.min")@signatures)))) ##} options(warn = 1)# warnings *immediately* (doExtras <- Rmpfr:::doExtras()) eps2 <- 2 * .Machine$double.eps eps8 <- 8 * .Machine$double.eps eps32 <- 32 * .Machine$double.eps ## must take the *larger* of the two precisions: stopifnot(substr(format(mpfr(1, 60)/mpfr(7, 160)), 1,51) == # format() may show more digits "0.1428571428571428571428571428571428571428571428571")# again has extra "2" at end (x <- mpfr(0:7, 100) / 7) ix <- x^-1000 iX <- asNumeric(ix) stopifnot( mpfrIs0(x - x), # badly failed on 64-bit identical(-x, 0-x),# testing "- x" all.equal(ix, (1/x)^1000, tol= 1e-25), is.numeric(iX), iX[1:4] == Inf, # failed previously as we used RNDD (downward rounding) all.equal(log(iX[5:8]), c(559.6157879, 336.4722366, 154.1506798, 0), tol = 1e-9)) ## checking hexadecimal input : stopifnot(mpfr("0xFFFFFFFFFFFFFFFFFFFF", base=16) + 1 == 2^80, ## sign(0) == 0: identical(sign(as(-1:1, "mpfr")), -1:1 + 0)) stopifnot(all.equal(as.numeric(x+ 1L), as.numeric(x)+1L, tol = eps2), as.integer( x [x < 1]) == 0,# was *wrong* {we round()ed; previously "down"!} as.integer((-x)[x < 1]) == 0,# (ditto) (3 * x)/3 <= x, all.equal(as.numeric(x * 2L), as.numeric(x + x), tol = 0)) u <- mpfr(0:17, 128)/17 two <- mpfr(2,100) stopifnot(all.EQ(u ^ two, u ^ 2), identical(u ^ 2, u ^ 2L), all.EQ(two ^ u, 2 ^ u), identical(2 ^ u, 2L ^ u), floor (3*u) == floor (3/17*(0:17)), ceiling(u*5) == ceiling(5/17*(0:17)) ) i7 <- mpfr(0:7, 200)/ 7 i17 <- mpfr(0:17, 300)/17 stopifnot(all.equal(as.numeric(x+1), as.numeric(x)+1), all.equal(round(x,2), round(asNumeric(x), 2), tol=1e-15), all.equal(round(mpfr(1.152, 80), 2), 1.15), # was wrong {as.integer() bug} all.equal(0:7, 7 * round ( i7, 25), tol = 2e-25), all.equal(0:7, 7 * round ( i7, 50), tol = 2e-50), all.equal(0:17, 17 * signif(i17,100), tol = 2e-100), all.equal(0:17, 17 * signif(i17, 20), tol = 2e-20) ) ## When we compute with 100 bits, ## we should compare relative errors with 2^-100 : del <- abs((x+pi)-pi - x) / 2^-100 stopifnot(del <= 4) ## <= 2 already (fd <- format(del, drop0 = TRUE)) stopifnot(all.equal(as.numeric(del), as.numeric(fd), tol = 1e-15)) if(print(Sys.info()[["machine"]]) == "x86_64") stopifnot(fd %in% as.character(c(0:2, c(2,7)/4))) checkPmin <- function(x, nx = as(x, "numeric")) { rx <- if(is(x,"mpfr")) round(x, 25) else x isZ <- is(x, "bigz") || is(nx, "bigz") M.X <- max(x, na.rm=TRUE) m.x <- min(x, na.rm=TRUE) stopifnot(all.equal(x, nx), pmin(x, x, M.X) %=N=% x, x %=N=% pmax(x, m.x, x), all.equal(x, pmin(x, nx, x, M.X)), all.equal(x, pmax(m.x, nx, x, rx, m.x)), if(isZ)TRUE else all.equal(pmin(x, 0.75), pmin(nx, 0.75)), if(isZ)TRUE else all.equal(pmax(x, 0.25), pmax(nx, 0.25))) } x <- mpfr(0:7, 100) / 7 checkPmin(x) nx <- (0:7)/7 (qx <- as.bigq(0:7, 7)) x[c(2,5)] <- NA nx[c(2,5)] <- NA qx[c(2,5)] <- NA Z <- as.bigz(1:7) mZ <- mpfr(Z, 64) stopifnot(Z == mZ, mZ == Z) checkPmin(x, nx) cat("checking pmin(. bigq ): ") ## FIXME checkPmin(x, qx); cat("[Ok]\n") ## print( base::pmin(Z, Z, max(Z)) )# via gmp:: rep.bigz(x, length.out = *) cat("checking pmin(. bigz ) [currently with lots of pmin() and pmax(...) warnings 'incompatible methods]:\n ") checkPmin(Z); cat("[Ok]\n") # via gmp:: all.equal.bigz() stopifnot(all.equal( round(x, 10), round(nx, 10)), all.equal(signif(x, 10), signif(nx, 10))) ## L & x , x & L failed in Rmpfr 0.2* and 0.4-2 stopifnot(identical(L <- x > 0.5, L & x), identical(L, x & L), identical(x > 0, x | L)) ##-------------- Modulo and "integer division" ------------- ## R's ?Arithmetic : ## ## ‘%%’ indicates ‘x mod y’ and ‘%/%’ indicates integer division. It ## is guaranteed that ‘x == (x %% y) + y * ( x %/% y )’ (up to ## rounding error) unless ‘y == 0’ where the result of ‘%%’ is ## ‘NA_integer_’ or ‘NaN’ (depending on the ‘typeof’ of the ## arguments). ## ## and has 'details' about how non-integer 'y' works ## (N <- if(doExtras) 1000 else 200) (todays.seed <- eval(parse(text=Sys.Date())))# so this is reproducible # (and constant within one day) set.seed(todays.seed) mm <- c(-4:4, sample(50, N-9, replace=TRUE)) for(n in seq_len(N)) { cat("."); if(n %% 50 == 0) cat(n,"\n") m <- mm[n] prec <- sample(52:200, 1)# "high precision" ==> can use small tol x <- sample(100, 50) - 20 for(kind in c('int','real')) { if(kind == "real") { m <- jitter(m) x <- jitter(x) tol.1 <- eps32 * pmax(1, 1/abs(m)) EQ <- function(x,y, tol = tol.1) isTRUE(all.equal(x, as.numeric(y), tol=tol)) EQ2 <- function(x,y, tol = tol.1) { ## for the DIV - MOD identity, a small x leads to cancellation all((x %=N=% y) | abs(x - y) < tol*pmax(abs(x), 1)) || isTRUE(all.equal(x, as.numeric(y), tol=tol)) } } else { ## "integer" EQ2 <- EQ <- function(x,y, tol) all(x %=N=% y) } i.m <- mpfr(x, prec) %% mpfr(m, prec) if(!EQ2(x %% m, i.m)) { cat("\n -- m = ",m," (prec = ",prec,")\n") rE <- range(rel.E <- as.numeric(1 - (x %% m)/i.m)) print(cbind(x, 'R.%%' = x %% m, rel.E)) MSG <- if(max(abs(rE)) < 1e-10) warningI else stop MSG(sprintf("not all equal: range(rel.Err.) = [%g, %g]", rE[1],rE[2])) } ## if(m != 0) { ##---Check the x == (x %% m) + m * ( x %/% m ) assertion ------ ## if(EQ2(x, (x %% m) + m*( x %/% m ), tol = 1e-12)) { ## ok for R ## --> also ok for mpfr ? iDm <- mpfr(x, prec) %/% mpfr(m, prec) rhs <- i.m + m*iDm if(!EQ2(x, i.m + m*iDm)) { cat("\n -- m = ",m," (prec = ",prec,")\n") print(cbind(x,' MPFR[ x%%m + m(x %/% m) ]' = as.numeric(rhs), rel.E)) MSG <- if(max(abs(rE)) < 1e-10) warningI else stop MSG(sprintf("Identity(MOD - DIV) not all eq.: range(rel.Err.) = [%g, %g]", rE[1],rE[2])) } } else { cat("\n hmm.. the basic %% <-> %/% assertion 'fails' in *R* :\n") rhs <- (x %% m) + m * ( x %/% m ) rel.E <- (1 - rhs/x) print(cbind(x, 'x%%m + m(x %/% m)' = rhs, rel.E)) } } } } ## mpfr o now implemented, for '%%', too : r <- as.double(i <- -10:20) stopifnot( ## %% ------------------------------------- mpfr(i, prec=99) %% 7 == i %% 7 , ## mpfr(i, prec=99) %% 7 == mpfr(i, prec=99) %% 7L , ## i %% mpfr(27, prec=99) == i %% 27 , ## r %% mpfr(27, prec=99) == r %% 27 , ## %/% ------------------------------------- mpfr(i, prec=99) %/% 7 == i %/% 7 , ## mpfr(i, prec=99) %/% 7 == mpfr(i, prec=99) %/% 7L , ## mpfr(i, prec=99) %/% mpfr(27, prec=99) == i %/% 27 , ## i %/% mpfr(27, prec=99) == i %/% 27 , ## i %/% mpfr(27, prec=99) == r %/% mpfr(27, prec=99) , TRUE ## ) cat('Time elapsed: ', proc.time(),'\n') # "stats" ## Was reproducible BUG in Rmpfr-addition (on Linux, MPFR 4.x.y) -- ## but the bug was Rmpfr, ## in ../src/Ops.c, detecting if *integer*, i.e., long can be used dn <- 1e20 dOO <- 9223372036854775808; formatC(dOO) # "9.2...e18" (r <- dn / (dn + dOO)) # 0.915555 (double prec arithmetic) ## but *so* strange when switching to Rmpfr : addition accidentally *subtract*!! n <- mpfr(dn, precBits = 99) (rM <- n / (n + dOO)) # wrongly gave " 1 'mpfr' .... 99 bits; 1.101605140483951..... stopifnot(exprs = { all.equal(n + dOO, dn + dOO) all.equal(n / (n + dOO), r) }) ###------Standard Statistics Functions -------------------------------------------------------- x <- c(del, 1000) stopifnot(identical(mean(x), mean(x, trim=0))) for(tr in (0:8)/16) stopifnot(all.equal(mean( x, trim = tr), mean(asNumeric(x), trim = tr), tol=1e-15)) cat('Time elapsed: ', proc.time(),'\n') # "stats" Rmpfr/tests/matrix-ex.R0000644000175000017500000001512613640371676014717 0ustar nileshnileshstopifnot(require("Rmpfr")) (f.chk <- system.file("check-tools.R", package="Rmpfr", mustWork=TRUE)) source(f.chk, keep.source=FALSE) ## -> Matrix test-tools + all.eq.finite(), all.EQ() x <- mpfr(0:7, 64)/7 mx <- x dim(mx) <- c(4,2) (m. <- mx) # "print" m.[,2] <- Const("pi", 80) m.[,] <- exp(mpfr(1, 90)) stopifnot(is(mx, "mpfrMatrix"), dim(mx) == c(4,2), is(m., "mpfrMatrix"), dim(m.) == dim(mx), dim(is.finite(mx)) == dim(mx), dim(is.nan(mx)) == dim(mx), getPrec(m.) == 90) xx <- (0:7)/7 m.x <- matrix(xx, 4,2) m2 <- mpfr(xx, 64); dim(m2) <- dim(m.x) ## u <- 10*(1:4) y <- 7 * mpfr(1:12, 80) my <- y dim(my) <- 3:4 m.y <- asNumeric(my) stopifnot(all.equal(m2, mpfr(m.x, 64), tol=0), # not identical(..) my[2,2] == 35, my[,1] == 7*(1:3)) .N <- function(x) { if(!is.null(dim(x))) as(x,"array") else as(x,"numeric") } noDN <- function(.) { dimnames(.) <- NULL ; . } allEQ <- function(x,y) all.equal(x,y, tol=1e-15) ## FIXME write "functions" that take x -> {mx , m.x} and run the following as *function* ## ---- then use previous case *and* cases with NA's ! ## and use higher precision via fPrec = 2 etc ... stopifnot(allEQ(m.x, noDN(.N(mx))), allEQ(m.y, noDN(.N(my))), allEQ(noDN(.N(my %*% mx)), m.y %*% m.x), allEQ(noDN(.N(crossprod(mx, t(my)))), crossprod(m.x, t(m.y))), allEQ(noDN(.N(tcrossprod(my, t(mx)))), tcrossprod(m.y, t(m.x))), ## identical(mx, t(t(mx))), identical(my, t(t(my))), ## matrix o vector .. even vector o vector identical(noDN(.N(my %*% 1:4)), m.y %*% 1:4 ), identical(noDN(.N(my %*% my[2,])), m.y %*% .N(my[2,])), identical( crossprod(1:3, my), 1:3 %*% my), identical(tcrossprod(1:4, my), 1:4 %*% t(my)), identical(crossprod(y), t(y) %*% y), identical(tcrossprod(y), y %*% t(y)), identical(noDN(.N( crossprod(y))), crossprod(7 * 1:12)), identical(noDN(.N(tcrossprod(y))),tcrossprod(7 * 1:12)), identical(tcrossprod(1:3, u), noDN(.N(tcrossprod(1:3, as(u,"mpfr"))))) ) mx[3,1] <- Const("pi", 64) stopifnot(allEQ(sum(mx[,1]), pi + 4/7)) m2 <- mx[c(1,4),] stopifnot(dim(m2) == c(2,2), sum(m2) == 2) ## "mpfrArray" o "mpfr" : Tmx <- array(TRUE, dim(mx), dimnames=dimnames(mx)) stopifnot(identical(Tmx, mx == (mx - mpfr(0, 10))), identical(Tmx, mx - mpfr(1, 10) * mx == 0)) ## subassignment, many kinds mx[5] <- pi mx[6] <- Const("pi",100) stopifnot(validObject(mx), allEQ(mx[5], mx[6]), getPrec(mx) == c(rep(64,5), 100, 64,64)) ## %*% with vectors on LHS, ... y <- t(2:4) # 1 x 3 matrix m1 <- (0:10) %*% y m2 <- mpfr(0:10, 50) %*% y stopifnot((d <- m1 - m2) == 0, identical(dim(m1), dim(d)), m2 == m1, m1 == m2) r <- 10*(0:4) y <- t(2:6) m1 <- 1:3 %*% y %*% r y. <- t(mpfr(2:6, 20)) m2 <- 1:3 %*% y. %*% r stopifnot(m1 == m2, m1 - m2 == 0, identical(dim(m1), dim(m2))) ### Array (non-matrix) ---- indexing & sub-assignment : A <- mpfrArray(1:24, prec = 96, dim = 2:4) a <- array(1:24, dim = 2:4) a.1 <- as(A[,,1], "array") a1. <- as(A[1,,], "array") A1. <- as(A[1,,], "mpfr") stopifnot(all.equal(noDN(a.1), a[,,1], tol=0), identical(A1., as.vector(A[1,,])), ## arithmetic, subsetting etc: allEQ(noDN(.N(A / A1.)), a/c(a1.)), allEQ(noDN(.N(a / A1.)), a/c(a1.)), identical(noDN(A == 23), a == 23), identical(noDN(10 >= A), 10 >= a), identical(noDN(A <= 2), a <= 2), identical(noDN(A < 2.5), a < 2.5), identical(noDN(A != 5), a != 5), identical(A != 3, !(3 == A)), identical(-1 > A, A == 100), identical(noDN(A <= 0), a == pi) ) A[1,2,3] <- Const("pi") A[1, ,2] <- 1 / A[1,,2] A ## check that A is "==" a where a <- array(1:24, 2:4); a[1,2,3] <- pi; a[1,,2] <- 1/a[1,,2] stopifnot(allEQ(noDN(.N(A)), a), ## check aperm() methods : allEQ(noDN(.N(aperm(A))), aperm(a)), {p <- c(3,1:2); allEQ(noDN(.N(aperm(A,p))), aperm(a,p))}, {p <- c(2:1,3); allEQ(noDN(.N(aperm(A,p))), aperm(a,p))}) ## cbind() / rbind(): options(warn = 2)## no warnings here - ("exact recycling"): validObject(m0 <- cbind(pi=pi, i = 1:6)) validObject(m1 <- cbind(a=Const("pi",60),i = 1:6, "1/mp" = 1/mpfr(1:3,70))) validObject(m2 <- cbind(pi=pi, i = 1:2, 1/mpfr(1:6,70))) validObject(n2 <- rbind(pi=pi, i = 1:2, 1/mpfr(1:6,70))) stopifnot(is(m0,"matrix"), is(m1, "mpfrMatrix"), is(m2, "mpfrMatrix"), dim(m0) == c(6,2), dim(m1) == c(6,3), dim(m2) == c(6,3)) options(warn = 1) suppressWarnings(eval(ex <- quote(m3 <- cbind(I=10, 1:3, inv=1/mpfr(2:3,80))))) validObject(suppressWarnings( n3 <- rbind(I=10, 1:3, inv=1/mpfr(2:3,80)))) stopifnot(identical(t(n2), m2), identical(t(n3), m3), validObject(m3), is(tryCatch(eval(ex), warning=function(.).), "warning"), identical(cbind("A", "c"), matrix(c("A", "c"), 1,2)), identical(rbind("A", 2), matrix(c("A", "2"), 2,1)) ) ## head() / tail() : stopifnot(all.equal(c(21, 12), dim(mm3 <- m3[rep(1:3, each=7), rep(3:1, 4)])), all.equal(dim(t3 <- tail(mm3)), c(6, 12)), all.equal(head(mm3), mm3[1:6,])) ## matrix() works since 2015-02-28: x <- mpfr(pi,64)*mpfr(2,64)^(2^(0:19)) (mx <- matrix(x, 4,5)) stopifnot(is(mx, "mpfrMatrix"), all.equal(matrix(0:19, 4,5), asNumeric(log2(log2(mx) - log2(Const("pi")))), tol = 1e-15)) # 64b-lnx: see 8.1e-17 ## Ensure that apply() continues to work with 'bigz'/'bigq' A <- matrix(2^as.bigz(1:12), 3,4) mA <- as(A, "mpfr") # failed {as dim(A) is "double", not "integer"} (Qm <- A / (A^2 - 1)) # big rational matrix MQ <- mpfr(Qm, precBits = 64) stopifnot(exprs = { mA == A mA == mpfr(A, precBits=16) mA == asNumeric(A) is.bigq(Qm) is(MQ, "mpfrMatrix") all.equal(Qm, MQ, tol = 1e-18) all.equal(dim(mA), dim(A ), tol=0) all.equal(dim(mA), dim(Qm), tol=0) identical(asNumeric(apply(A, 1, min)), apply(asNumeric(A), 1, min)) identical(asNumeric(apply(A, 1, max)), apply(asNumeric(A), 1, max)) }) ## mA etc, failed up to Rmpfr 0.8-1; the apply() parts failed up to Rmpfr 0.6.0 if(FALSE) ## Bug in gmp <= 0.5-12 : stopifnot( identical(asNumeric(apply(A, 1, range)), apply(asNumeric(A), 1, range)) ) if(FALSE) ## Bug in gmp <= 0.5-12 : stopifnot( identical(asNumeric(apply(A, 2, max)), apply(asNumeric(A), 2, max)) ) if(FALSE) ## Bug in gmp <= 0.5-12 : stopifnot( all.equal(asNumeric(apply(A, 1, mean)), apply(asNumeric(A), 1, mean)) , all.equal(asNumeric(apply(A, 2, mean)), apply(asNumeric(A), 2, mean)) ) cat('Time elapsed: ', proc.time(),'\n') # "stats" if(!interactive()) warnings() Rmpfr/tests/binomial-etc.R0000644000175000017500000000201612113707255015324 0ustar nileshnileshstopifnot(require("Rmpfr")) stopifnot(chooseMpfr(1:10, 0) == 1,# failed earlier chooseMpfr(20, 0:20) == choose(20, 0:20), chooseMpfr(19, 0:20) == choose(19, 0:20), chooseMpfr (30, 4:30) * (-1)^(4:30) == chooseMpfr.all(30, k0=4, alternating=TRUE) ) cat('Time elapsed: ', proc.time(),'\n') # "stats" ## sumBinomMpfr() ... had embarrasing bug for a while sBn <- Rmpfr:::sumBinomMpfr.v1 stopifnot( all.equal( sBn(10, sqrt), sumBinomMpfr(10, sqrt), tol=1e-77) , all.equal( sBn(10, log, n0=1, alternating=FALSE), sumBinomMpfr(10, log, n0=1, alternating=FALSE), tol=1e-77) ) fBin <- function(k) x^k * (1-x)^(n-k) ## \sum_{k=0}^n (n \\ k) x^k (1-x)^{n-k} == sum(dbinom(0:n, n, prob=x)) == 1 : for(x in runif(50)) { n <- 1 + rpois(1, lambda=10) cat(".") stopifnot(all.equal(1, sumBinomMpfr(n, fBin, alternating=FALSE), tol = 1e-15)) };cat("\n") cat('Time elapsed: ', proc.time(),'\n') # "stats" if(!interactive()) warnings() Rmpfr/tests/bit-repr.Rout.save0000644000175000017500000002151213220705115016165 0ustar nileshnilesh R Under development (unstable) (2017-06-24 r72853) -- "Unsuffered Consequences" Copyright (C) 2017 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > stopifnot(suppressPackageStartupMessages(require("Rmpfr"))) > ## (checking that the 32 / 64 bit GMP message does *not* show here) > > ### Try to look at the internal bit-representation of the limbs > > .limbs <- function(x) { + stopifnot(is(x, "mpfr")) + lapply(x@.Data, slot, "d") # not sapply() each can have different prec. & #{limbs} + } > .expo <- function(x) { + stopifnot(is(x, "mpfr")) + sapply(x@.Data, slot, "exp") + } > > Bits <- function(x) { + L <- .limbs(x)# list(length n) each of "k(prec)" 32-bit ints + ## NB: mpfr(2, .) and all mpfr(2^k, .) also have a 'd' ending in NA integer! + ## [reason: after all, R's NA_integer_ is INT_MAX+1 = 2^31 ] + ## and the mpfr(c(NA,NaN, Inf, -Inf), .) have *no* NA in 'd' (but all in 'exp'! + ## see .mpfr2list() example below + + hasNA <- any(iNA <- sapply(lapply(L, is.na), any)) # iNA: TRUE if there's an NA + ## need to catch them later + CC <- function(ch) paste(ch, collapse="") + hex <- sapply(L, function(.) CC(sprintf("%x", rev(.)))) + if(hasNA) hex[iNA] <- NA_character_ + hex <- strsplit(hex, NULL) + + db <- t(expand.grid(0:1,0:1,0:1,0:1, KEEP.OUT.ATTRS=FALSE)[,4:1]) + storage.mode(db) <- "character" # "0" or "1" + dimnames(db) <- list(NULL, c(paste(0:9), letters[1:6])) + ## db is 4 x 16 matrix with col.names "0" "1" .. "9" "a" "b" ... "f" + + ex <- .expo(x) + if(is.matrix(ex)) { + ## 64-bit case: exponent is long == two ints + ## ----------- the 2nd int is in {0, -1, NA} (NA : for 0) + ex2 <- ex[2,] + ex <- ex[1,] + } + pat <- paste("(", sapply(pmax(0, ex), + function(n) CC(rep.int(".", n))), + ")0+$", sep="") + ## pat <- ifelse(iNA, NA_character_, pat) + + getbits <- function(ch) CC(as.vector(db[,ch])) + + ## drop trailing zeros (from r[[i]], via pat[i]), keeping correct number: + drop0.r <- function(i) sub(pat[i], "\\1", r[[i]]) + + if(hasNA) { + r <- as.list(iNA) + r[!iNA] <- lapply(hex[!iNA], getbits) + r[!iNA] <- lapply(which(!iNA), drop0.r) + ## FIXME this is wrong -- really have powers of 2, and want their (easy) bits : + r[iNA ] <- NA_character_ + unlist(r) + } + else { + r <- lapply(hex, getbits) + sapply(seq_along(r), drop0.r) + } + + } > > x <- mpfr(r <- c(NA,NaN, Inf, -Inf), 64) > stopifnot(identical(asNumeric(x), # mpfr has no NA, just NaN's: + c(NaN,NaN, Inf, -Inf)), + identical(as.character(fDec <- formatDec(x)), + as.character(asNumeric(x))) # of different nchar() for now + ) > formatDec(x) # should print fine (no quotes) [1] NaN NaN Inf -Inf > > > if(FALSE) # platform dependent: + ## The "non-finite" mpfr value internals (in 64-bit: 'exp' has NA): + str(.mpfr2list(x)) > > > ## bug in Bits(): all (exact) powers of 2 will show as NA: > > x <- mpfr(c(3:5,11:16, 59, 125:128, 1024:1025), 64) > x 16 'mpfr' numbers of precision 64 bits [1] 3 4 5 11 12 13 14 15 16 59 125 126 127 128 1024 [16] 1025 > data.frame(x= as.numeric(x), I(Bits(x))) x Bits.x. 1 3 11 2 4 3 5 101 4 11 1011 5 12 1100 6 13 1101 7 14 1110 8 15 1111 9 16 10 59 111011 11 125 1111101 12 126 1111110 13 127 1111111 14 128 15 1024 16 1025 10000000001 > > x <- mpfr(c(-20:-1, 1:30),64)# w/o 0 - as its mantissa is "random" (in 64-bit) > data.frame(x= as.numeric(x), I(Bits(x))) x Bits.x. 1 -20 10100 2 -19 10011 3 -18 10010 4 -17 10001 5 -16 6 -15 1111 7 -14 1110 8 -13 1101 9 -12 1100 10 -11 1011 11 -10 1010 12 -9 1001 13 -8 14 -7 111 15 -6 110 16 -5 101 17 -4 18 -3 11 19 -2 20 -1 21 1 22 2 23 3 11 24 4 25 5 101 26 6 110 27 7 111 28 8 29 9 1001 30 10 1010 31 11 1011 32 12 1100 33 13 1101 34 14 1110 35 15 1111 36 16 37 17 10001 38 18 10010 39 19 10011 40 20 10100 41 21 10101 42 22 10110 43 23 10111 44 24 11000 45 25 11001 46 26 11010 47 27 11011 48 28 11100 49 29 11101 50 30 11110 > b0 <- Bits(mpfr(0, 64)) # not printing it here -- they are "random" for this special case! > > (half <- mpfr(0.5, 64)*(1 + mpfr(2, 64)^-16 * (-3:3))) 7 'mpfr' numbers of precision 64 bits [1] 0.49997711181640625 0.4999847412109375 0.49999237060546875 [4] 0.5 0.50000762939453125 0.5000152587890625 [7] 0.50002288818359375 > Bits(half) [1] "1111111111111101" "111111111111111" "1111111111111111" [4] NA "10000000000000001" "1000000000000001" [7] "10000000000000011" > > ## pi, in varying number of bits : > p. <- round(pi* 2^c(10,16,5*(4:8))) > dput(p.)#-> the definition of p : c(3217, 205887, 3294199, 105414357, 3373259426, 107944301636, 3454217652358) > p <- mpfr(c(3217, 205887, 3294199, 105414357, + 3373259426, 107944301636, 3454217652358), 64) > stopifnot(all.equal(p., p, tolerance = 1e-15)) > ## all the mantissas are those of pi, rounded differently: > Bits(c(p, Const("pi", 64))) [1] "110010010001" [2] "110010010000111111" [3] "1100100100001111110111" [4] "110010010000111111011010101" [5] "11001001000011111101101010100010" [6] "1100100100001111110110101010001000100" [7] "110010010000111111011010101000100010000110" [8] "1100100100001111110110101010001000100001011010001100001000110101" > > ###--- and possibly the _internal_ sprintfMpfr() --- see also ./tstHexBin.R > ## TODO: use examples above for checking formatBin() <---> ============ > spr <- Rmpfr:::sprintfMpfr > ##= ~~~~~~~~~~~ > (fB.04 <- formatBin(i16.04 <- mpfr(0:16, 4))) [1] +0b0.000p+0 +0b1.000p+0 +0b1.000p+1 +0b1.100p+1 +0b1.000p+2 +0b1.010p+2 [7] +0b1.100p+2 +0b1.110p+2 +0b1.000p+3 +0b1.001p+3 +0b1.010p+3 +0b1.011p+3 [13] +0b1.100p+3 +0b1.101p+3 +0b1.110p+3 +0b1.111p+3 +0b1.000p+4 > (fB.60 <- formatBin(i16.60 <- mpfr(0:16, 60))) [1] +0b0.00000000000000000000000000000000000000000000000000000000000p+0 [2] +0b1.00000000000000000000000000000000000000000000000000000000000p+0 [3] +0b1.00000000000000000000000000000000000000000000000000000000000p+1 [4] +0b1.10000000000000000000000000000000000000000000000000000000000p+1 [5] +0b1.00000000000000000000000000000000000000000000000000000000000p+2 [6] +0b1.01000000000000000000000000000000000000000000000000000000000p+2 [7] +0b1.10000000000000000000000000000000000000000000000000000000000p+2 [8] +0b1.11000000000000000000000000000000000000000000000000000000000p+2 [9] +0b1.00000000000000000000000000000000000000000000000000000000000p+3 [10] +0b1.00100000000000000000000000000000000000000000000000000000000p+3 [11] +0b1.01000000000000000000000000000000000000000000000000000000000p+3 [12] +0b1.01100000000000000000000000000000000000000000000000000000000p+3 [13] +0b1.10000000000000000000000000000000000000000000000000000000000p+3 [14] +0b1.10100000000000000000000000000000000000000000000000000000000p+3 [15] +0b1.11000000000000000000000000000000000000000000000000000000000p+3 [16] +0b1.11100000000000000000000000000000000000000000000000000000000p+3 [17] +0b1.00000000000000000000000000000000000000000000000000000000000p+4 > stopifnot( + identical(sub("00p","p", spr(i16.60, bits = 10)), + spr(i16.60, bits = 4)), + identical(spr(i16.60, bits = 4), + spr(i16.04, bits = 4)) + , + all.equal(i16.04, mpfr(fB.04), tolerance = 0) + , + all.equal(i16.60, mpfr(fB.60), tolerance = 0) + ) > > ## not even this one > two <- mpfr(2, precBits = 60) > stopifnot(identical(two, mpfr(formatBin(two)))) > > > cat('Time elapsed: ', proc.time(),'\n') # "stats" Time elapsed: 0.67 0.102 0.855 0.002 0.001 > > if(!interactive()) warnings() > > proc.time() user system elapsed 0.672 0.103 0.855 Rmpfr/tests/bit-repr.R0000644000175000017500000001031013220705115014472 0ustar nileshnileshstopifnot(suppressPackageStartupMessages(require("Rmpfr"))) ## (checking that the 32 / 64 bit GMP message does *not* show here) ### Try to look at the internal bit-representation of the limbs .limbs <- function(x) { stopifnot(is(x, "mpfr")) lapply(x@.Data, slot, "d") # not sapply() each can have different prec. & #{limbs} } .expo <- function(x) { stopifnot(is(x, "mpfr")) sapply(x@.Data, slot, "exp") } Bits <- function(x) { L <- .limbs(x)# list(length n) each of "k(prec)" 32-bit ints ## NB: mpfr(2, .) and all mpfr(2^k, .) also have a 'd' ending in NA integer! ## [reason: after all, R's NA_integer_ is INT_MAX+1 = 2^31 ] ## and the mpfr(c(NA,NaN, Inf, -Inf), .) have *no* NA in 'd' (but all in 'exp'! ## see .mpfr2list() example below hasNA <- any(iNA <- sapply(lapply(L, is.na), any)) # iNA: TRUE if there's an NA ## need to catch them later CC <- function(ch) paste(ch, collapse="") hex <- sapply(L, function(.) CC(sprintf("%x", rev(.)))) if(hasNA) hex[iNA] <- NA_character_ hex <- strsplit(hex, NULL) db <- t(expand.grid(0:1,0:1,0:1,0:1, KEEP.OUT.ATTRS=FALSE)[,4:1]) storage.mode(db) <- "character" # "0" or "1" dimnames(db) <- list(NULL, c(paste(0:9), letters[1:6])) ## db is 4 x 16 matrix with col.names "0" "1" .. "9" "a" "b" ... "f" ex <- .expo(x) if(is.matrix(ex)) { ## 64-bit case: exponent is long == two ints ## ----------- the 2nd int is in {0, -1, NA} (NA : for 0) ex2 <- ex[2,] ex <- ex[1,] } pat <- paste("(", sapply(pmax(0, ex), function(n) CC(rep.int(".", n))), ")0+$", sep="") ## pat <- ifelse(iNA, NA_character_, pat) getbits <- function(ch) CC(as.vector(db[,ch])) ## drop trailing zeros (from r[[i]], via pat[i]), keeping correct number: drop0.r <- function(i) sub(pat[i], "\\1", r[[i]]) if(hasNA) { r <- as.list(iNA) r[!iNA] <- lapply(hex[!iNA], getbits) r[!iNA] <- lapply(which(!iNA), drop0.r) ## FIXME this is wrong -- really have powers of 2, and want their (easy) bits : r[iNA ] <- NA_character_ unlist(r) } else { r <- lapply(hex, getbits) sapply(seq_along(r), drop0.r) } } x <- mpfr(r <- c(NA,NaN, Inf, -Inf), 64) stopifnot(identical(asNumeric(x), # mpfr has no NA, just NaN's: c(NaN,NaN, Inf, -Inf)), identical(as.character(fDec <- formatDec(x)), as.character(asNumeric(x))) # of different nchar() for now ) formatDec(x) # should print fine (no quotes) if(FALSE) # platform dependent: ## The "non-finite" mpfr value internals (in 64-bit: 'exp' has NA): str(.mpfr2list(x)) ## bug in Bits(): all (exact) powers of 2 will show as NA: x <- mpfr(c(3:5,11:16, 59, 125:128, 1024:1025), 64) x data.frame(x= as.numeric(x), I(Bits(x))) x <- mpfr(c(-20:-1, 1:30),64)# w/o 0 - as its mantissa is "random" (in 64-bit) data.frame(x= as.numeric(x), I(Bits(x))) b0 <- Bits(mpfr(0, 64)) # not printing it here -- they are "random" for this special case! (half <- mpfr(0.5, 64)*(1 + mpfr(2, 64)^-16 * (-3:3))) Bits(half) ## pi, in varying number of bits : p. <- round(pi* 2^c(10,16,5*(4:8))) dput(p.)#-> the definition of p : p <- mpfr(c(3217, 205887, 3294199, 105414357, 3373259426, 107944301636, 3454217652358), 64) stopifnot(all.equal(p., p, tolerance = 1e-15)) ## all the mantissas are those of pi, rounded differently: Bits(c(p, Const("pi", 64))) ###--- and possibly the _internal_ sprintfMpfr() --- see also ./tstHexBin.R ## TODO: use examples above for checking formatBin() <---> ============ spr <- Rmpfr:::sprintfMpfr ##= ~~~~~~~~~~~ (fB.04 <- formatBin(i16.04 <- mpfr(0:16, 4))) (fB.60 <- formatBin(i16.60 <- mpfr(0:16, 60))) stopifnot( identical(sub("00p","p", spr(i16.60, bits = 10)), spr(i16.60, bits = 4)), identical(spr(i16.60, bits = 4), spr(i16.04, bits = 4)) , all.equal(i16.04, mpfr(fB.04), tolerance = 0) , all.equal(i16.60, mpfr(fB.60), tolerance = 0) ) ## not even this one two <- mpfr(2, precBits = 60) stopifnot(identical(two, mpfr(formatBin(two)))) cat('Time elapsed: ', proc.time(),'\n') # "stats" if(!interactive()) warnings() Rmpfr/tests/create.R0000644000175000017500000001210713523036312014221 0ustar nileshnileshrequire("Rmpfr") ### Simple basic examples of creation of "mpfr" objects pi. <- Const("pi", prec = 260) pi. # nicely prints 80 digits [260 * log10(2) ~= 78.3 ~ 80] ## These both failed (in mpfr2str(.)) with a seg.fault: c(mpfr(1, prec=3), pi.) m0 <- mpfr(numeric(), prec=64) ## print()ing / str() of 0-length mpfr stopifnot( grepl("0 'mpfr' numbers", capture.output( m0)), grepl("0 'mpfr' numbers", capture.output(str(m0)))) c(m0,m0) # failed in Rmpfr <= 0.6-0 stopifnot(identical(c(m0,m0), m0), identical(c(m0,pi.), pi.), identical(c(pi.,m0), pi.)) ## This is TRUE for 0 and -0 : Zero <- mpfr(c(0,1/-Inf), 20) stopifnot(mpfrIs0(Zero), is.whole(Zero)) stopifnot(mpfr.is.0(Zero))# deprecated but must work stopifnot(mpfr.is.integer(Zero))# deprecated but must work Zero # the "-0" should print correctly stopifnot(.getSign(Zero) == c(1,-1), sign(Zero) == 0, identical(format(Zero, digits=1), c("0.", "-0."))) ## testing 'recycling' b <- c(20,120,80, 60) (x <- mpfr(2^-(5:7), precBits = b)) d.spec <- c(0,NA,NaN,Inf,-Inf) (spec <- mpfr(d.spec, 3)) stopifnot(length(x) == 4, x[1] == x[4], getPrec(x) == b, identical(is.na(spec), is.na(d.spec)), identical(is.finite(spec), is.finite(d.spec)), identical(is.infinite(spec), is.infinite(d.spec)), ## mpfr(, .) : identical(x, mpfr(x, getPrec(x))), identical(spec, mpfr(spec, getPrec(spec))), asNumeric(1/mpfr(x, 16)) == 2^c(5:7,5), identical(format(spec), c("0.", "NaN", "NaN", "Inf", "-Inf")), mpfr(0.2, prec = 5:15, rnd.mode = "D") < 0.2) B.set <- setNames(2:62, paste0("B=",2:62)) str(lapply(B.set, function(B) format(spec, base= B)))# "0.0" and "0.00" -- FIXME t2 <- mpfr(2^10,3) ## digits = 1 used to crash: MPFR assertion failed: m >= 2 || ((((b) & ((b) - 1)) == 0) == 0 && m >= 1) ## ---------- (+ seg.fault) for 'base = 2' (and others, not for default base = 10), ## digits = NULL should choose "enough" ... but does not str(r <- lapply(B.set, function(B) .mpfr2str(t2, digits=1, base = B))) str(r. <- lapply(B.set, function(B) .mpfr2str(t2, base = B))) ## FIXME: still too short x <- c(-12, 1:3 * pi) sss <- mpfr(x, 100) validObject(sss) sss sss2 <- sss * sss stopifnot(identical(sss2, sss * x), identical(sss2, x * sss), sss ^ 2 == sss2) ## and go back {not sure if identical() is guaranteed here, but it seems...}: stopifnot(identical(x, as(sss, "numeric"))) (cs <- as(sss, "character")) y <- c(0, 100,-10, 1.25, -2.5, x * c(1,100,1e5,1e20), x / 100^(1:4)) (Y <- mpfr(y, 100)) cbind(y, as.data.frame(.mpfr2str(Y, 20))[,c("exp","str")]) s <- mpfr(43208, 14)# low precision eps8 <- 8 * .Machine$double.eps ## checking mpfr -> character -> mpfr: i1..5f <- c("4.e+4", "4.3e+4", "4.32e+4", "43210.", "43208.") stopifnot(exprs = { all.equal(y, as.numeric(format(Y, digits=20)), tol= eps8) all.equal(Y, as(format(Y), "mpfr"), tol= eps8) identical(sapply(1:5, formatMpfr, x=s), i1..5f) identical(sapply(1:5, formatMpfr, x=s, exponent.plus=FALSE), sub("e[+]", "e", i1..5f)) }) ## More character -> mpfr checking : ## from echo 'scale=200; 4*a(1)' | bc -l : cpi <- "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196" pi. <- Const("pi", prec=667) stopifnot(cpi == format(mpfr(cpi, prec=667), digits=201), all.equal(pi., as(cpi, "mpfr")), all.equal(pi., as(cpi, "mpfr"), tol = 1e-200)) set.seed(17) ## Check double -> mpfr -> character -> double : ## Unfortunately, format(, .) -> .mpfr2str() triggers a memory bug ## that I think is an MPFR library "mis-feature" ## 2011-02-09 -- bug *no longer* triggered ! rSign <- function(n) sample(c(-1,1), size = n, replace=TRUE) N <- function(x) as.numeric(x) ntry <- if(Sys.getenv("USER") == "maechler") 150 else 5 for(n in 1:ntry) { cat(if(n %% 10)"." else n) x. <- rSign(100) * rlnorm(100) prec <- rpois(1, 110); digs <- floor(0.95*(prec / log2(10))) X. <- mpfr(x., precBits = prec) stopifnot(all.equal(x., N(format(X., digits=digs)), tol = eps8) , all.equal(x., N(log(exp(X.))), tol = 32*eps8) ) }; cat("\n") stopifnot(identical(mpfr.is.0(X.),# deprecated but must work mpfrIs0 (X.))) X. <- X.[!mpfrIs0(X.)] stopifnot(all( X./X. == 1)) # TRUE u <- mpfr(as.raw(0:100)) z <- mpfr(1:12, 200) z[z > 100] <- 100 # nothing done (but used to fail) z[] <- 0 stopifnot(0:100 == u, is(z,"mpfr"), mpfrIs0(z), all.equal(u, mpfr(0:100, prec = 8), tol = 0), 0:1 == mpfr(1:2 %% 2 == 0)) z[3] <- Const("pi",200) ## z has length 12 -- now extend it: z[15:17] <- 1/mpfr(10:12, 100) stopifnot(all.equal(z[1:4], c(0,0,pi,0), tol = 1e-15), validObject(z), all.equal(z[13:17], c(NaN,NaN, 1/(10:12)), tol = 1e-15)) ## These seg.faulted (each via different R -> C interface) in the past: assertError <- tools::assertError assertError( pp <- Const("pi", prec = 1e11) ) assertError( mpfr("123.456", precBits= 1e11) ) assertError( mpfr(as.bigz(3), precBits= 1e11) ) stopifnot(identical(mpfr(NULL), mpfr(logical()))) Rmpfr/tests/special-fun-ex.R0000644000175000017500000003233714107223103015600 0ustar nileshnileshstopifnot(require("Rmpfr")) (doExtras <- Rmpfr:::doExtras()) all.eq.finite <- function(x,y, ...) { ## x = 'target' y = 'current' if(any(is.finite(y[!(fx <- is.finite(x))]))) return("current has finite values where target has not") if(any(is.finite(x[!(fy <- is.finite(y))]))) return("target has finite values where current has not") ## now they have finite values at the same locations all.equal(x[fx], y[fy], ...) } n <- 1000 head(x <- mpfr(0:n, 100) / n) stopifnot(range(x) == 0:1 ,all.equal(as.numeric(j0(x)), besselJ(as.numeric(x), 0), tol = 1e-14) ,all.equal(as.numeric(j1(x)), besselJ(as.numeric(x), 1), tol = 1e-14) ,all.equal(as.numeric(y0(x)), besselY(as.numeric(x), 0), tol = 1e-14) ,all.equal(as.numeric(y1(x)), besselY(as.numeric(x), 1), tol = 1e-14) ) ### pnorm() -> erf() : ---------------------------------------------------------- u <- 7*x - 2 stopifnot(all.equal(pnorm(as.numeric(u)), as.numeric(pnorm(u)), tol = 1e-14)) ## systematic random input testing: set.seed(101) if(doExtras) { nSim <- 50 n2 <- 100 } else { nSim <- 10 n2 <- 64 } for(n in 1:nSim) { N <- rpois(1, lambda=n2) N3 <- N %/% 3 x <- c(rnorm(N-N3), 10*rt(N3, df=1.25))# <- some large values m <- rnorm(N, sd = 1/32) s <- rlnorm(N, sd = 1/8) cEps <- .Machine$double.eps for(LOG in c(TRUE,FALSE)) for(L.T in c(TRUE,FALSE)) { p. <- pnorm( x, m=m,sd=s, log.p=LOG, lower.tail=L.T) stopifnot(all.equal(p., pnorm(mpfr(x, precBits= 48), m=m,sd=s, log.p=LOG, lower.tail=L.T), tol = 128 * cEps)) stopifnot(all.equal(p., pnorm(mpfr(x, precBits= 60), m=m,sd=s, log.p=LOG, lower.tail=L.T), tol = 2 * cEps)) } cat(".") };cat("\n") proc.time() ## Jerry Lewis - Aug 2, 2019 ## Contrast the results of pnorm with double and mpfr inputs x <- c(1:9, 5*(2:9), 10*(5:20)) ; x <- c(-rev(x), 0, x) pdL <- pnorm(x, log.p=TRUE) pdU <- pnorm(x, log.p=TRUE, lower.tail=FALSE) stopifnot(exprs = { !is.unsorted(x) 35 %in% x x == -rev(x) # exactly pdL == rev(pdU) # even exactly, currently }) mx <- mpfr(x, precBits = 128) pmL <- pnorm(mx, log.p=TRUE) pmU <- pnorm(mx, log.p=TRUE, lower.tail=FALSE) stopifnot(exprs = { pmL < 0 # not true for 'pdL' which underflows pmL == rev(pmU) # even exactly, currently all.equal(pmL, pdL, tol=4e-16) # 'tol=0' shows 4.46e-17 }) ## some explorations : dlp <- diff(log(-pmL))/diff(x) n <- length(x) x.1 <- (x[-1] + x[-n])/2 plot(x.1, dlp, type="b", ylab = "d/dx log(-pnorm(., log=TRUE))") plot(x.1[-1], diff(dlp)/diff(x.1), type="b", ylab = "d^2/dx^2 log(-pnorm(., log=TRUE))") stopifnot(exprs = { -1 < (d2 <- diff(dlp)/diff(x.1)) d2 < 0 diff(d2) < 0 }) x.3 <- x.1[-c(1L,n-1L)] plot(x.3, -diff(d2)/ diff(x.1)[-1], type="o", log="y") ### Riemann's Zeta function: ---------------------------------------------------- ## -- integer arguments -- stopifnot(all(mpfrIs0(zeta(-2*(1:100))))) k.neg <- 2*(-100:0) - 1 Z.neg <- zeta(k.neg) plot(k.neg, abs(as.numeric(Z.neg)), type = "l", log="y") Pi <- Const("pi", 128L) ## confirm published value of Euler's gamma to 100 digits pub.g <- paste("0.5772156649", "0153286060", "6512090082", "4024310421", "5933593992", "3598805767", "2348848677", "2677766467", "0936947063", "2917467495", sep="") ## almost = our.g <- Const("gamma", log2(10) * 100) # 100 digits (ff.g <- .mpfr2str(our.g)) M <- function(x) mpfr(x, 128L) stopifnot(all.equal(zeta( 0), -1/2, tol = 2^-100) , all.equal(zeta(-1), -1/M(12), tol = 2^-100) , all.equal(zeta(-3), 1/M(120), tol = 2^-100) ## positive ones : , all.equal(zeta(2), Pi^2/6, tol = 2^-100) , all.equal(zeta(4), Pi^4/90, tol = 2^-100) , all.equal(zeta(6), Pi^6/945, tol = 2^-100) ) ### Exponential Integral Ei(.) curve(Ei, 0,5, n=5001) if(mpfrVersion() >= "3") { ## only available since MPFR 3.0.0 ### Airy function Ai(.) curve(Ai, -10, 5, n=5001); abline(h=0,v=0, col="gray", lty=3) } ### Utilities hypot(), atan2() : --- TODO ! ## beta(), lbeta() ## --------------- ## The simplistic "slow" versions: B <- function(a,b) { a <- as(a, "mpfr"); b <- as(b, "mpfr"); gamma(a)*gamma(b) / gamma(a+b) } lB <- function(a,b) { a <- as(a, "mpfr"); b <- as(b, "mpfr"); lgamma(a)+lgamma(b) - lgamma(a+b) } ## For partly *integer* arguments Bi1 <- function(a,b) 1/(a*chooseMpfr(a+b-1, a)) # a must be integer >= 0 Bi2 <- function(a,b) 1/(b*chooseMpfr(a+b-1, b)) # b must be integer >= 0 x <- 1:10 + 0 ; (b10 <- mpfr(x, 128L)) stopifnot(all.equal( B(1,b10), 1/x), all.equal( B(2,b10), 1/(x*(x+1))), all.equal( beta(1,b10), 1/x), all.equal( beta(2,b10), 1/(x*(x+1))), TRUE) x <- -10:10 + 0; X <- mpfr(x, 128L) stopifnot(Bi1(1,X) == (B1x <- Bi2(X,1)), Bi1(2,X) == (B2x <- Bi2(X,2)), Bi1(3,X) == (B3x <- Bi2(X,3)), all.equal(B1x, 1/x, tol= 4e-16) , all.equal(B2x, 1/(x*(x+1)), tol= 8e-16) , all.equal(B3x, 2/(x*(x+1)*(x+2)), tol=16e-16) , ## these the "poles" are all odd i.e. result in { +Inf / -Inf / NaN} ## are all "ok" {e.g. 1/(x*(x+1)) gives (-Inf, Inf) for x = -1:0 } all.eq.finite(beta(1,X), 1/x) , all.eq.finite(beta(X,2), 1/(x*(x+1))) , all.eq.finite(beta(3,X), 2/(x*(x+1)*(x+2)), tol=16e-16) , TRUE) ## (a,b) *both* integer, one negative: for(i in (-20):(-1)) { cat(i,":\n") a <- mpfr(i, 99) i1 <- i+1 b. <- seq_len(-i1) Bab <- beta(a, b.) stopifnot(is.nan(beta(a, (i1:0))), is.nan(lbeta(a, (i1:0))), all.equal(Bab, Bi2(a, b.), tol=1e-20), all.equal(lbeta(a, b.), log(abs(Bab)), tol=1e-20), allow.logical0 = TRUE) } ## (a,b) all positive c10 <- b10 + 0.25 for(a in c(0.1, 1, 1.5, 2, 20)) { stopifnot(all.equal( B(a,b10), (bb <- beta(a, b10))), all.equal(lB(a,b10), (lb <- lbeta(a, b10))), all.equal(lb, log(bb)), all.equal( B(a,c10), (bb <- beta(a, c10))), all.equal(lB(a,c10), (lb <- lbeta(a, c10))), all.equal(lb, log(bb)), TRUE) } ## However, the speedup is *not* much (50%) when applied to vectors: stopifnot(validObject(xx <- outer(b10, runif(20))), dim(xx) == c(length(b10), 20), validObject(vx <- as(xx, "mpfr")), class(vx) == "mpfr", is.null(dim(vx))) C1 <- replicate(10, system.time(bb <<- beta(vx, vx+2))) C2 <- replicate(10, system.time(b2 <<- B(vx, vx+2))) summary(1000*C1[1,]) ## 80.3 {cmath-5, 2009} summary(1000*C2[1,]) ## 125.1 { " } stopifnot(all.equal(bb, b2)) ## and for a single number, the speedup is a factor 3: x1 <- vx[1]; x2 <- x1+2 system.time(for(i in 1:100) bb <- beta(x1, x2))# .27 system.time(for(i in 1:100) b2 <- B(x1, x2))# .83 ## a+b is integer <= 0, but a and b are not integer: a <- b <- .5 + -10:10 ab <- data.matrix(expand.grid(a=a, b=b, KEEP.OUT.ATTRS=FALSE)) ab <- mpfr(ab[rowSums(ab) <= 0, ], precBits = 128) stopifnot( beta(ab[,"a"], ab[,"b"]) == 0, lbeta(ab[,"a"], ab[,"b"]) == -Inf) ## was NaN in Rmpfr <= 0.5-2 stopifnot(all.equal(6 * beta(mpfr(1:3,99), -3.), c(-2,1,-2), tol=1e-20)) ## add more checks, notably for b (> 0) above and below the "large_b" in ## ../src/utils.c : bb <- beta(mpfr(1:23, 128), -23) stopifnot(all.equal(bb, Bi1(1:23, -23), tol=1e-7)) # Bi1() does not get high prec for small b ## can be written via rationals: N / D : bn <- c(330, -360, 468, -728, 1365, -3120, 8840, -31824, 151164, -1007760, 10581480, -232792560) bn <- c(rev(bn[-1]), bn) bd <- 24* as.bigz(2 * 3 * 5 * 7 * 11) * 13 * 17 * 19 * 23 stopifnot(all.equal(bb, as(bn/bd,"mpfr"), tol=0)) stopifnot(all.equal(6 * beta(mpfr(1:3, 99), -3.), c(-2,1,-2), tol=1e-20), all.equal( lbeta(mpfr(1:3, 128), -3.), log(mpfr(c( 2,1, 2), 128) / 6), tol=1e-20)) ## add more checks, notably for b (> 0) above and below the "large_b" in ## ../src/utils.c : bb <- beta(mpfr(1:23, 128), -23) stopifnot(all.equal(bb, Bi1(1:23, -23), tol=1e-7)) # Bi1() does not get high prec for small b ## can be written via rationals: N / D : bn <- c(330, -360, 468, -728, 1365, -3120, 8840, -31824, 151164, -1007760, 10581480, -232792560) bn <- c(rev(bn[-1]), bn) bd <- 24* as.bigz(2 * 3 * 5 * 7 * 11) * 13 * 17 * 19 * 23 stopifnot(all.equal(bb, as(bn/bd,"mpfr"), tol=0)) ## 2) add check for 'b' > maximal unsigned int {so C code uses different branch} two <- mpfr(2, 128) for(b in list(mpfr(9, 128), mpfr(5, 128)^10, two^25, two^26, two^100)) { a <- -(b+ (1:7)) stopifnot(a+b == -(1:7), # just ensuring that there was no cancellation is.finite( B <- beta(a,b)), ## was NaN .. is.finite(lB <- lbeta(a,b)), ## ditto all.equal(log(abs(B)), lB), TRUE) } ee <- c(10:145, 5*(30:59), 10*(30:39), 25*(16:30)) b <- mpfr(2, precBits = 10 + max(ee))^ee # enough precision {now "automatic"} stopifnot((b+4)-b == 4, # <==> enough precision above b == (b. <- as(as(b,"bigz"),"mpfr"))) (pp <- getPrec(b.))# shows why b. is not *identical* to b. system.time(Bb <- beta(-b-4, b))# 0.334 sec if(dev.interactive()) plot(ee, asNumeric(log(Bb)), type="o",col=2) lb <- asNumeric(log(Bb)) ## using coef(lm(lb ~ ee)) stopifnot(all.equal(lb, 3.175933 -3.46571851*ee, tol = 1e-5))# 4.254666 e-6 bb <- beta( 1:4, mpfr(2,99)) stopifnot(identical(bb, beta(mpfr(2,99), 1:4)), all.equal((2*bb)*cumsum(1:4), rep(1, 4), tol=1e-20), getPrec(bb) == 128) ##-- The d*() density functions from ../R/special-fun.R | ../man/distr-etc.Rd --- dx <- 1400+ 0:10 mx <- mpfr(dx, 120) nx <- sort(c(c(-32:32)/2, 50*(-8:8))) xL <- 2^(989+(0:139)/4) # "close" to double.xmax dnbD <- dnbinom(xL, prob=1-1/4096, size=1e307, log=TRUE)# R's own iF <- -(130:140) # index of finite dnbD[] dnbx8 <- dnbinom(xL, prob=1-mpfr(2, 2^ 8)^-12, size=1e307, log=TRUE) dnbx10 <- dnbinom(xL, prob=1-mpfr(2, 2^10)^-12, size=1e307, log=TRUE) dnbx13 <- dnbinom(xL, prob=1-mpfr(2, 2^13)^-12, size=1e307, log=TRUE) stopifnot(exprs = { all.equal(dpois(dx, 1000), dpois(mx, 1000), tol = 3e-13) # 64b Lnx: 7.369e-14 all.equal(dbinom(0:16, 16, pr = 4 / 5), dbinom(0:16, 16, pr = 4/mpfr(5, 128)) -> db, tol = 5e-15)# 64b Lnx: 4.3e-16 all.equal(dnorm( -3:3, m=10, s=1/4), dnorm(mpfr(-3:3, 128), m=10, s=1/4), tol = 1e-15) # 64b Lnx: 6.45e-17 all.equal(dnorm(nx), dnorm(mpfr(nx, 99)), tol = 1e-15) all.equal(dnorm( nx, m = 4, s = 1/4), dnorm(mpfr(nx, 99), m = 4, s = 1/4), tol = 1e-15) all.equal(dnorm( nx, m = -10, s = 1/4, log=TRUE), dnorm(mpfr(nx, 99), m = -10, s = 1/4, log=TRUE), tol = 1e-15) ## t-distrib. : all.equal(dt(nx, df=3), dt(mpfr(nx, 99), df=3), tol = 1e-15) all.equal(dt( nx, df = 0.75), dt(mpfr(nx, 99), df = 0.75), tol = 1e-15) all.equal(dt( nx, df = 2.5, log=TRUE), dt(mpfr(nx, 99), df = 2.5, log=TRUE), tol = 1e-15) ## negative binomial dnbinom(): all.equal(dnbx13, dnbx10, tol = 2^-999) # see 2^-1007, but not 2^-1008 all.equal(dnbx13, dnbx8, tol = 2^-238) # see 2^-239, but not 2^-240 all.equal(dnbx10[iF], dnbD[iF], tol = 6e-16) # R's *is* accurate here (seen 2.9e-16) }) ## plot dt() "error" of R's implementation nx <- seq(-100, 100, by=1/8) dtd <- dt( nx, df= .75) dtM <- dt(mpfr(nx, 256), df= .75) system.time( dtMx <- dt(mpfr(nx, 2048), df= .75) ) # 2.4 sec stopifnot(all.equal(dtMx, dtM, tol = 2^-254)) # almost all of dtM's 256 bits are correct !? relE <- asNumeric(dtd/dtM - 1) plot(relE ~ nx, type="l", col=2) plot(abs(relE) ~ nx, type="l", col=2, log="y", ylim=c(5e-17, 1.5e-15)) ## dnbinom() -- has mode as expected, but with huge size, the scales are "off reality" .. ### dgamma(): ---------------------------------------------------- xe <- c(-2e5, -1e5, -2e4, -1e4, -2000, -1000, -500, -200, -100, -50, -20, -10) (xe <- c(xe, -8:8, -rev(xe))) two <- mpfr(2, 64) ## For centering at E[.], will use xP(x, shp) : xP <- function(x, d) x - d*(x > d) aEQformat <- function(xy, ...) format(xy, digits = 7, ...) allEQ_0 <- function (target, current, ...) all.equal(target, current, tolerance = 0, formatFUN = aEQformat, ...) stopIfNot <- if("allow.logical0" %in% names(formals(stopifnot))) { # experimental (MM only) stopifnot } else function(exprs, allow.logical0) stopifnot(exprs=exprs) for(shp in c(2^c(-20, -3, -1:1, 4, 10, 50))) { cat("shape = 2^", log2(shp), ":\n-------------\n") d.dg <- dgamma(xP(2 ^ xe, shp), shape=shp) m.dg <- dgamma(xP(two^xe, shp), shape=shp) m.ldg <- dgamma(xP(two^xe, shp), shape=shp, log=TRUE) stopIfNot(exprs = { !is.unsorted(xe) is.finite(m.dg) m.dg >= 0 shp > 1 || all(diff(m.dg) <= 0) shp > 100|| all((m.dg > 0) >= (d.dg > 0)) any(fin.d <- is.finite(d.dg)) m.dg[!fin.d] > 1e300 { cat("all.EQ(, ):", allEQ_0(m.dg[fin.d], d.dg[fin.d]), "\n") shp > 100 || all.equal(m.dg[fin.d], d.dg[fin.d], tol = 1e-13) # 2.063241e-14 } ## compare with log scale : if(any(pos.d <- m.dg > 0)) { cat("all.EQ(log(d), d*(log)):", allEQ_0 (log(m.dg[pos.d]), m.ldg[pos.d]),"\n") all.equal(log(m.dg[pos.d]), m.ldg[pos.d], tol = 1e-14) } }, allow.logical0 = TRUE) } cat('Time elapsed: ', proc.time(),'\n') # "stats" if(!interactive()) warnings() Rmpfr/tests/tstHexBin.R0000644000175000017500000001466414127021566014706 0ustar nileshnileshrequire(Rmpfr) sessionInfo() nums <- c(0, .625, .1, .3, .3125, .5, .6, (.3+.6), .9, 1, 3.3125) nums9 <- mpfr(nums, precBits = 9) n5.b2 <- mpfr("101", base=2) stopifnot(identical(n5.b2, mpfr(5, precBits=3)), identical(n5.b2, mpfr("0b101", base=2))) if(FALSE)## 0b101 could also be a Hex number with no initial '0x' -- hence NOT true: identical(n5.b2, mpfr("0b101")) ## We *could* say that anything starting with '0b' is binary, anything with '0x' is hexadecimal ### mpfr.Bcharacter() method [was 'mpfrBchar', was 'scanBin'] : ##' Check the inverse of formatBin(), i.e., mpfr() working correctly chkInv.fBin <- function(x, ...) { stopifnot(is(x, "mpfr")) nb <- formatBin(x, ...) xx <- mpfr(nb) ## Inverse should work {apart from 0: that is not uniquely represented in MPFR!} stopifnot(identical(mpfrIs0(x ) -> i0, mpfrIs0(xx)), identical(x[!i0], xx[!i0])) invisible(nb) } (nums9bc <- chkInv.fBin(nums9)) (nums9bF <- chkInv.fBin(nums9, scientific=FALSE)) # "F": Fixed format (as in Fortran) ## higher precision, 0,Inf, sign change: (i12 <- 1 / mpfr(c(-2:12, Inf), 64)) (i12.50 <- roundMpfr(i12, precBits=50)) # "same", with 50 (< 53) bits try({ ## FIXME -- formatBin() bug -- fails for 'Inf' ! (nI.12 <- chkInv.fBin(i12 )) (nI.12.50 <- chkInv.fBin(i12.50)) }) ii <- mpfr(c(-Inf, 17, Inf), 7) formatHex(ii) ## fine formatDec(ii) ## not 100% ok, as it has "." [FIXME ?] n9. <- Rmpfr:::mpfr.Ncharacter(nums9bc) n9_ <- mpfr(nums9bc) ## Inverse worked {apart from 0: it is not at all uniquely represented in MPFR!} stopifnot(identical(mpfrIs0(n9.), mpfrIs0(n9_)), all.equal(n9_, n9., tolerance=0), identical(nums9[-1], n9.[-1])) mpfr(nums9bc, precBits=5) (n9.5 <- mpfr(nums9bF, scientific=FALSE, precBits=5)) stopifnot(all.equal(n9.5, mpfr(nums9bF, precBits=5), tol=0)) stopifnot(all.equal(n9., n9.5, tol = 0.02), getPrec(n9.5) == 5) mpfr(nums9bF, scientific=FALSE) mpfr(nums9bF) ### mpfr() -> mpfrHchar (was 'scanHex') : nums9hc <- formatHex(nums9) stopifnot(all.equal(n9., mpfr(nums9hc), tol = 0), all.equal(n9.5, mpfr(nums9hc, precBits=5), tol = 0)) ### Rest from ../R/formatHex.R -- heavily modified (m32 <- matrix(0:31, 8, 4, dimnames = list(0:7, c(0,8,16,24)))) FourBits <- mpfr(m32, precBits=4) FiveBits <- mpfr(m32, precBits=5) stopifnot(all.equal(m32, asNumeric(FiveBits), tol=0), all.equal(m32, asNumeric(FourBits), tol= 0.05)) ## HH:::formatHexInternal(FourBits) formatHex(FourBits) formatHex(FourBits, precBits=5) formatHex(FourBits, precBits=6) formatBin(FourBits) formatBin(FourBits, precBits=5) formatBin(FourBits, scientific=FALSE) formatBin(FourBits, scientific=FALSE, precBits=5) formatDec(FourBits) formatDec(FourBits, precBits=5) formatDec(FourBits, precBits=7) ## HH:::formatHexInternal(FiveBits) formatHex(FiveBits) formatHex(FiveBits, precBits=5) formatHex(FiveBits, precBits=6) formatBin(FiveBits) formatBin(FiveBits, precBits=5) formatBin(FiveBits, precBits=6) formatBin(FiveBits, scientific=FALSE) formatBin(FiveBits, scientific=FALSE, precBits=6) formatDec(FiveBits) formatDec(FiveBits, precBits=5) formatDec(FiveBits, precBits=7) TenPowers <- mpfr(matrix(10^(-3:5)), precBits=53) row.names(TenPowers) <- -3:5 TenPowers options(width = 180) # for several "wide" displays below ## This indirectly "checks' as.data.frame.Ncharacter(): mkDF <- function(mv, displaydigits = 4, stringsAsFactors = FALSE) { stopifnot(is.numeric(mv) || inherits(mv, "mpfr")) data.frame(Hex = formatHex(mv), Bin = formatBin(mv), BinF= formatBin(mv, scientific=FALSE), Dec = formatDec(mv), Dec4= formatDec(mv, displaydigits=displaydigits), Dec.= formatDec(mv, scientific=TRUE), Dec.4=formatDec(mv, scientific=TRUE, displaydigits=displaydigits), stringsAsFactors = stringsAsFactors) } nmsMkDF <- c("Hex", "Bin", "BinF", "Dec", "Dec4", "Dec.", "Dec.4") d10p. <- mkDF(TenPowers) (d10p <- mkDF(as.vector(TenPowers))) TenFrac <- matrix((1:10)/10, dimnames=list(1:10, expression(1/x))) TenFrac stopifnot(exprs = { is.matrix(print(formatHex(TenFrac))) # stays a matrix is.matrix(print(formatBin(TenFrac))) is.matrix(print(formatBin(TenFrac, scientific=FALSE))) is.matrix(print(formatDec(TenFrac))) }) TenFrac9 <- mpfr(TenFrac, precBits=9) TenFrac9 data.frame(Hex = formatHex(TenFrac9), ## checking as.data.frame.Ncharacter as well Bin = formatBin(TenFrac9), BinF= formatBin(TenFrac9, scientific=FALSE), Dec = formatDec(TenFrac9)) -> d9 d9 ## Does not print the column names but the colnames of each 1-col. matrix ("1/x"). ## This is how R in general works { in format.data.frame() } ## now use vectors: tenfrac9 <- as.vector(TenFrac9) stopifnot(identical(tenfrac9, c(TenFrac9))) data.frame(Hex = formatHex(tenfrac9), Bin = formatBin(tenfrac9), BinF= formatBin(tenfrac9, scientific=FALSE), Dec = formatDec(tenfrac9)) -> dl9 dl9 # (now prints as d9 had printed in the past) stopifnot(exprs = { getPrec(TenFrac ) == 53 getPrec(TenFrac9) == 9 colnames(d9) == c("Hex", "Bin", "BinF", "Dec") inherits(d9, "data.frame") all.equal(dim(d9), c(10,4)) }) (Ten <- matrix(1:10 + 0.0, dimnames=list(1:10, "x"))) ## + 0.0 forces double precision dT <- mkDF(Ten) dt <- mkDF(as.vector(Ten)) dt # large (Ten4 <- mpfr(Ten, precBits=4)) ten4 <- as.vector(Ten4) D4 <- mkDF(Ten4) # would be printing "x" --- because we added one-column matrices !! (d4 <- mkDF(ten4)) # printing fine ! stopifnot(identical(names(d4), names(D4)), identical(names(d4), nmsMkDF)) Two8 <- matrix(2^seq(-8, 8)) Two8.3 <- mpfr(Two8, precBits=3) ## formatBin stopifnot( identical(sapply(as(Two8.3, "mpfr")[-c(1:3, 15:17)], function(t83) formatBin(t83, scientific=FALSE)), c("+0b.____100", "+0b.___100", "+0b.__100", "+0b._100", "+0b.100", "+0b1.00","+0b10.0","+0b100.","+0b100_.","+0b100__.","+0b100___."))) ## formatDec --- these must be perfectly aligned on the "." ! formatDec(Two8.3, digits = 3) formatDec(Two8.3, digits = 8) stopifnot( identical(capture.output(formatDec(Two8.3, digits = 3))[2:4], c(" [1,] 0.00391", " [2,] 0.00781", " [3,] 0.0156 ")) , identical(capture.output(formatDec(Two8.3, digits = 8))[c(2:3,8,13,16)], c(" [1,] 0.0039062500", " [2,] 0.0078125000", " [7,] 0.25000000 ", "[12,] 8.0000000 ", "[15,] 64.000000 ")) ) Rmpfr/tests/functionals.R0000644000175000017500000000723712351300637015315 0ustar nileshnilesh#### Tests for "Functionals": Root finding, Optimization, Integration, etc stopifnot(require("Rmpfr")) (f.chk <- system.file("check-tools.R", package="Rmpfr", mustWork=TRUE)) source(f.chk, keep.source=FALSE) ## -> all.eq.finite(), all.EQ(), ... options(warn = 1)# warnings *immediately* (doExtras <- Rmpfr:::doExtras()) ### 1. Integration ----------------------------------------------- ## Example from Lauren K, June 2014 (~/R/MM/Pkg-ex/Rmpfr/integrateR-LaurenK.R): beta0 <- 0.05 beta1 <- 0.05 (tau <- sqrt(0.01*0.05*0.95/0.99))# = 0.0219.. ## Z00 <- 9 Z01 <- 1 Z10 <- 18 Z11 <- 2 N <- Z00+Z01+Z10+Z11 integrand <- function(u) { ee.u <- exp(-u^2/2)/(sqrt(2*pi)*tau) b0u <- beta0 + tau*u b1u <- beta1 + b0u # == beta0+beta1+ tau*u ee.u ^ (Z00+Z01 + Z10+Z11) * (1-b0u)^Z00 * b0u ^ Z01 * (1-b1u)^Z10 * b1u ^ Z11 } ## MM: note how the integrand() function looks: op <- par(mfcol=c(3,1), mgp=c(1.5, .6, 0), mar=.1+c(3,3,0,0)) ax1 <- function(a,b) axis(1, at=c(a,b), col=2, col.axis=2, tcl= +3/4, mgp=c(3,0,0)) curve(integrand, -5,5, n=1000) cc <- adjustcolor(2, 1/4) ## look closer: ep <- .01; rect(-3, -ep, 0, +ep, col=cc, border=cc); ax1(-3,0) curve(integrand, -3,0, n=1000, ylim = c(-ep,ep)) ## but now look really closely : ep <- .001; rect(-3, -ep, -2, +ep, col=cc); ax1(-3,-2) curve(integrand, -3,-2, n=1000, ylim = c(-ep, ep)) par(op) (I1 <- integrate(integrand,lower = -100, upper = 100)) (I1. <- integrate(integrand,lower = -100, upper = 100, rel.tol = 1e-14)) showSys.time(I2 <- integrateR(integrand, lower = -100, upper = 100)) I2 ## ... Warning ‘no convergence up to order 13’ ## Solaris Sparc (2014-06, CRAN checks); thanks Brian: print(I2[1:2], digits=15) I2.Solaris <- list(value = 1.3963550396006e+33, abs.error = 1.79487857486724e+28) I.db <- list(value = 1.39635503960059e+33, abs.error = 1.79487857478077e+28) stopifnot( all.equal(I2[1:2], I.db, tol = 1e-10)# Solaris SPARC needs at least 4.8e-11 ) ## Now using high accuracy showSys.time(I3 <- integrateR(integrand, lower = mpfr(-100, precBits=256), upper = 100)) ## much slower but not better (and not worse) I3 assert.EQ.(sapply(I3[1:2], asNumeric), unlist(I.db)) ## Really get better when decreasing the integration interval ## from [-100, 100] to [-10, 10] ... which should give "the same" showSys.time(I4 <- integrateR(integrand, lower = mpfr(-10, precBits=256), upper = 10, ord = 15, verbose=TRUE)) ## ~ 6.6 sec [lynne 2013] I4 ## on the left side, there is "nothing" (and negative, as we know!): showSys.time(I0.1 <- integrateR(integrand, lower = mpfr(-1000, precBits=256), upper = -10, ord= 11, verbose=TRUE)) showSys.time(I0.2 <- integrateR(integrand, lower = mpfr(10, precBits=256), upper = 1000, ord= 11, verbose=TRUE)) I0.1 I0.2 I4 ## Integral [-1000, +1000 ] = Int[-1000, -10] + Int[-10, +10] + Int[+10, +1000]: I4 $value + I0.1 $value + I0.2 $value ## but this is really the same as just the middle: stopifnot(I4 $value + I0.1 $value + I0.2 $value == I4 $value) value <- I4$value; delta <- I4$abs.err nDig <- -asNumeric(log10(delta/value)) cat("Correct number of digits: ", round(nDig, 2),"\n", "Integral I = ", format(I4$value, digits = ceiling(nDig)), " (last change change= ", format(delta, digits = 7),")\n", "integrate(.) = ", format(I1 $value, digits = 22),"\n", "integrate(., rtol=1e-15)= ", format(I1.$value, digits = 22),"\n", sep="") ### 2. Root Finding ---------------------------------------------- ### 3. Optimization / Minimization, .. --------------------------- cat('Time elapsed: ', proc.time(),'\n') # "stats" Rmpfr/ChangeLog0000644000175000017500000004407513742567662013300 0ustar nileshnilesh2015-04-29 Martin Maechler * inst/NEWS.Rd: new; this 'ChangeLog' should not be used anymore 2015-02-28 Martin Maechler * R/array.R (matrix.mpfr): new S3 method for 'matrix(, ...)', mostly to help confused users. * R/special-fun.R (pnorm, j0, ...): do *NOT* use as(x, "mpfr") when 'x' is an "mpfrMatrix" / "mpfrArray" (-> uses dim(), etc!) 2015-02-16 Martin Maechler * R/array.R (norm): new matrix norm()'s of "all kinds" 2014-12-13 Martin Maechler * DESCRIPTION (Version): 0.6-0 * is.finite(M), is.na(M) now keep dim() for "mpfrArray" inputs. 2014-11-27 Martin Maechler * DESCRIPTION (Version): 0.5-7, released to CRAN, 2014-11-27, r205 * R/as.R (as.integer): fix bug, ensuring that "Z" rounding is used 2014-09-05 Martin Maechler * R/as.R (mpfrImport, mpfrXport): new utilities, somewhat experimental 2014-06-23 Martin Maechler * R/integrate-Romberg.R (integrateR): when 'ord' is specified and one of 'rel.tol' or 'abs.tol', convergence is checked, and if achieved, computations stop earlier. When 'ord' is NULL (default), and '*.tol' is specified, continue until convergence (or memory explosion). The default (none of these specified) is to try convergence up to 'ord = 13'. * DESCRIPTION (Version): 0.5-6, released to CRAN, 2014-09-05, r203 * R/as.R (mpfr): also allow rounding mode "A" (= "Away from zero") * R/array.R (mpfrArray): as that is supported from MPFR 3.0.0 on * R/array.R (toNum): new optional argument 'rnd.mode' * man/mpfr.Rd: doku and mini check * src/convert.c (R_rnd2MP): allow "A" as well * src/convert.c (mpfr2d, mpfr2i): extra argument rnd_mode. NOTA BENE: "D" rounding previously, but new default is "N". Consequently, asNumeric(x) etc give 'Inf' instead of 1.797693e+308. * R/gmp-convert.R (..bigz2mpfr,...): add 'rnd.mode' argument 2014-06-19 Martin Maechler * DESCRIPTION (Version): 0.5-5 released to CRAN, 2014-06-19, r190 * R/integrate-Romberg.R (print.integrateR): own print method: print _value_ even when warning. 2014-05-19 Martin Maechler * vignettes/log1mexp-note.Rnw: update to log1pexp(); cosmetics 2014-05-01 Martin Maechler * R/special-fun.R: pbetaI(a,b) for larger (a,b); new mpfr versions of * man/distr-etc.Rd: dbinom(), dpois(), dnorm() * R/mpfr.R (mpfr_default_prec, .mpfr.minPrec, .mpfr.erange, ..): * src/utils.c (R_mpfr_get_default_prec, ...): new functions to get, check, (and partly working) set default exponent ranges and precision. 2014-01-01 Martin Maechler * src/Ops.c (Math_mpfr): new sinpi(), cospi() for R >= 3.1.0 2013-10-21 Martin Maechler * DESCRIPTION (Version): 0.5-4, released to CRAN, 2013-10-22, r173 Now again depends on 'methods' (instead of just importing). 2013-05-04 Martin Maechler * R/mpfr.R (.mat2ind): from a proposal by Serguei Sokol, new utility, to be used for matrix subsetting and replacement, in .mpfr.subset() and .mpfr.repl(). __FIXME__ add checking code! 2013-02-28 Martin Maechler * R/Math.R (sumBinomMpfr): oops: docu had (-1)^k instead of (-1)^(n-k); alternating=FALSE has been wrong, since (r101, 2012-05-15) 2013-02-14 Martin Maechler * R/gmp-convert.R (..bigq2mpfr): precB = NULL --> at least 128 2013-02-05 Martin Maechler * DESCRIPTION (Version): 0.5-2 * R/as.R (asNumeric): new function; mainly for 'mpfrArray' * src/Ops.c (R_mpfr_mod): for Arith_mpfr[_i|_d]), R's %% and %/%: now working correctly, checked in * tests/arith-ex.R: * R/array.R (mkDet, determinant): provide recursive method for determinant() and hence det(). *Only* for small matrices !! * src/Summary.c (R_mpfr_sumprod): new for sum(x * y) == x %*% y -> 20-40% faster matrix multiplication {still not fast!}. 2012-12-03 Martin Maechler * DESCRIPTION (Version): 0.5-1, released to CRAN 2012-12-03 * man/Rmpfr-package.Rd: a nice overview help page * inst/doc/log1mexp-note.Rnw: cosmetic changes {would be ready to submit now}. 2012-06-16 Martin Maechler * DESCRIPTION (Version): 0.5-0, released to CRAN on 2012-07-07 * R/as.R (mpfr): or arguments now "work" (with a warning). * R/gmp-convert.R (.bigz2mpfr, .bigq2mpfr): new optional argument \code{precB}, typically for increasing the default precision. 2012-06-04 Martin Maechler * R/optimizers.R (optimizeR): new simple golden ratio, thanks to Hans Werner Borchers. 2012-05-22 Martin Maechler * DESCRIPTION (Version, Depends): 0.4-8, released to CRAN on 2012-05-23 * R/mpfr.R (diff.mpfr): new method; as diff.default() commits unclass(x) (str.mpfr): new. 2012-05-04 Martin Maechler * R/as.R (formatN.mpfr): add method * NAMESPACE: import S3 generic 'formatN' from gmp. 2012-05-01 Martin Maechler * NAMESPACE: import S3 generic 'is.whole' from gmp( >= 0.5-2) now. * man/is.whole.Rd: only mpfr method. 2012-04-30 Martin Maechler * DESCRIPTION (Version, Depends): 0.4-7; depend on new gmp; can get rid of if() tests. * R/gmp-convert.R (.bigq2mpfr): new. 2012-02-06 Martin Maechler * DESCRIPTION (Version): 0.4-6, released to CRAN on 2012-02-06; (Depends): gmp, not just "suggest", so we have a well-defined search() path order: Rmpfr comes before gmp. * R/special-fun.R (pnorm): much improved partly bad code, thanks to a report from Jerry Lewis. 2012-01-14 Martin Maechler * src/utils.c (my_mpfr_choose, my_mpfr_poch): fix case n == 0. * R/mpfr.R, R/array.R: add argument 'right = TRUE' to the print() * man/mpfr-utils.Rd: methods which looks better, e.g., for integers. * src/utils.c (R_MPFR_2_Numeric_Function) (R_MPFR_2_Num_Long_Function): do *not* warn anymore when arguments are of "non-matching" lengths. * R/Math.R (chooseMpfr.all): new arguments 'k0', 'alternating' and 'precBits'. 2011-12-27 Martin Maechler * DESCRIPTION (Version): 0.4-5 * src/convert.c (mpfr2str): dig_n_max was off 2011-11-28 Martin Maechler * DESCRIPTION (Version): 0.4-4, released to CRAN on 2011-11-30 * src/Ops.c (Compare_mpfr, etc): fix (silly!) nx * ny integer overflow; problem reported by Anton Korobeynikov. * R/unirootR.R: produce warning when convergence happen to "pole". 2011-09-08 Martin Maechler * DESCRIPTION (Version): 0.4-3, released to CRAN on 2011-09-09 * R/array.R (applyMpfr): -> apply() method for "mfprArray" (mpfr2array): fix for the case of dim() <- (colSums, etc): also add simple methods for colSums, rowMeans, etc. * man/mpfrArray.Rd: add apply() examples 2011-08-23 Martin Maechler * R/unirootR.R (unirootR): R-only version of uniroot(), carefully ensuring * man/unirootR.Rd: that as.numeric(.) is used only in some cases; thanks to John Nash's very recent R code in his 'rootoned' package. 2011-08-11 Martin Maechler * R/Arith.R: add "Logic" methods (mpfr, numeric), avoiding inf.recursion. * tests/arith-ex.R: now checks that. 2011-08-09 Martin Maechler * DESCRIPTION (Version): 0.4-2, now with a * NAMESPACE: 2011-07-30 Martin Maechler * src/Ops.c (Rmpfr_minus, Rmpfr_abs): new C versions, called in * R/Arith.R * R/Math.R 2011-07-29 Martin Maechler * R/array.R (mpfr2array): speedup, not using new(cl, ...) for check=FALSE (= new default). 2011-07-21 Martin Maechler * R/mpfr.R ([[): finished adding a '[[' method which returns one "mpfr" number (instead of a "mpfr1" one). Needed a bit of changes, notably in .getPrec() etc. 2011-05-12 Martin Maechler * DESCRIPTION (Version): 0.3-0 -- "finished" integrateR(); using vapply() 2011-04-30 Martin Maechler * R/special-fun.R (Bernoulli): B(0) = 1 now also works. 2011-03-09 Martin Maechler * R/integrate-Romberg.R (integrateR): new pure Rfunction for Romberg integration; works with "mpfr". * man/integrateR.Rd: docu & examples. 2011-01-18 Martin Maechler * R/Math.R (roundMpfr): "round" to precBits (bits!) also to *increase* precision for further computation. * src/utils.c (my_mpfr_round): C implementation. * R/Math.R (factorialMpfr, pochMpfr): new functions, e.g., as tools for choose(). * src/utils.c (my_mpfr_poch, R_mpfr_fac): underlying C code. 2011-01-17 Martin Maechler * R/as.R (formatMpfr): fix the case where 'Ex == digits' 2011-01-16 Martin Maechler * src/Ops.c (Math_mpfr): enable digamma() for mpfr 3.0.0 and later (Math_mpfr): implement cummax(), cummin(), cumprod(), cumsum() * src/Ops.c, R/special-fun.R: enable Airy function ai() 2011-01-15 Martin Maechler * R/mpfr.R (.getPrec): return default precision instead of NULL for 0-length input; this enables [FALSE] <- 1. * R/array.R (mpfr2array): new utility as alternative to 'dim(.) <- *' * R/as.R (mpfr): now also works with matrix or array input, returning "mpfrArray"/"..Matrix". 2011-01-10 Martin Maechler * DESCRIPTION (Version): 0.2-4 * R/Math.R (factorial): improve integer test (thanks to Petr Savicky). 2010-01-22 Martin Maechler * DESCRIPTION (Version): 0.2-3 * src/convert.c (R_rnd2GMP): new; allow to specify "rounding mode" from R. For now, for conversion to MPFR. Change default to use (round to) [N]earest rather than [D]ownwards. 2010-01-21 Martin Maechler * DESCRIPTION (Version): 0.2-2 * R/as.R (formatMpfr): add 'showNeg0' argument, and fix printing of zeros. * R/mpfr.R ([): ensure out-of-range indexing returns valid "mpfr". * tests/create.R: test the above. 2010-01-20 Martin Maechler * R/mpfr.R (.getPrec, getPrec): previous getPrec() renamed to .getPrec(); the new getPrec() also works for simple R "numbers", and is used in mpfr(), and the following : * R/mpfr.R ([<-): for non-"mpfr" value, use at least the previous precision, following a chat with Petr Savicky. * src/convert.c (d2mpfr1_list): ensure x is recycled when prec is longer than x. (str2mpfr1_list): ditto. 2010-01-18 Martin Maechler * DESCRIPTION (Version): 0.2-1 * R/array.R (.matmult.R): "obvious" speed up, replacing the innermost for() loop by a sum(); inspired by a patch from Petr. *However* the real speedup would use a .Call(..) directly! 2010-01-16 Martin Maechler * R/mpfr.R (.mpfr.repl, [<-): change such that x[] <- 1 works; also z[i] <- v when i is larger than length(z). * tests/create.R: test the above. 2010-01-15 Martin Maechler * R/array.R (.matmult.R): tcrossprod changes along to the bug fix in R (!). * DESCRIPTION (Version): 0.2-0 2010-01-14 Martin Maechler * R/array.R ([<-): define for more signatures (%*%, crossprod, tcrossprod): extend signatures to include more pairs, and using "Mnumber" instead of just "array_or_vector". * tests/matrix-ex.R: test part of that * man/*-class.Rd: additions, notably as.vector() and as(, "vector"). 2010-01-13 Martin Maechler * DESCRIPTION (Version): 0.1-8 * R/Math.R (.mpfr.sign): fix to ensure sign(0) |-> 0. Reported by Petr Savicky. * tests/arith-ex.R: test it. * src/init.c, src/convert.c (d2mpfr): outcomment unused function 2009-10-31 Martin Maechler * R/array.R: add "mpfrArray" -> "matrix" coercion * R/Arith.R (Arith): fix length check in ("mpfr", "array") * R/Consts.R (Const): nicer error message when 'name' is invalid. 2009-10-29 Martin Maechler * R/special-fun.R (beta, lbeta): new methods added * src/utils.c (my_mpfr_beta, my_mpfr_lbeta): own C functions, calling mpfr_*() ones, for beta() and lbeta(). * tests/special-fun-ex.R (B,lB): add tests for beta(), lbeta() 2009-09-14 Martin Maechler * src/Makevars.win: -lmpfr *before* -lgmp (does matter some places) 2009-09-10 Martin Maechler * R/mpfr.R (mpfrVersion): factor out .mpfrVersion() 2009-09-07 Martin Maechler * DESCRIPTION (Version): 0.1-7; released to CRAN * R/mpfr.R (mpfrVersion): amend for funny version string on Debian testings. * R/mpfr.R (mpfrVersion): new utility * src/utils.c (R_mpfr_get_version): C level * man/utils.Rd: doc * src/Ops.c (Math_mpfr): older MPFR libraries do not provide Li2(). 2009-09-03 Martin Maechler * R/Math.R (factorial): method which rounds in integer case. * man/mpfr-class.Rd: docu and examples. * man/is.whole.Rd: new for new is.whole() 2009-09-02 Martin Maechler * R/special-fun.R (Li2): add Li2() * man/mpfr-class.Rd: explicitly "enumerate" the 'Math' and 'Summary' group functions. 2009-09-01 Martin Maechler * DESCRIPTION (Version): 0.1-6, CRAN-released on 2009-09-04 * R/Math.R (Math2, i.e., round, signif): allow missing digits { => default digits = 0 or 6, respectively}. * R/mpfr.R (print, etc): use drop0trailing = TRUE per default. * R/as.R (formatMpfr): renamed from .format.mpfr; finalize using prettyNum(), add corresponding arguments and document: * man/formatMpfr.Rd: new * src/convert.c (mpfr2str): allocate the char 'ch' ourselves, carefully using R_alloc() and S_realloc(); unfortunately, the MPFR allocator *still* messes with our SEXPs. 2009-08-31 Martin Maechler * R/mpfr.R (seqMpfr): seqMpfr(3,1) works (again?) 2009-08-16 Martin Maechler * src/convert.c (mpfr2str): be over-PROTECT()ive, as Kurt reports VECTOR_ELT() errors on some platforms, and I can "randomly systematically" reproduce them with gctorture(). 2009-08-06 Martin Maechler * DESCRIPTION (Version): 0.1-5 -- release-ready * man/seqMpfr.Rd, ...: add all missing *Rd pages. * R/mpfr.R (seqMpfr): remove FIXME, using new pmin(), pmax(). * R/Math.R (Math2): group methods - for round() and signif() * src/convert.c (mpfr2i): new, for as(. "integer") 2009-08-05 Martin Maechler * R/mpfr.R (pmin, pmax): now seem to work * R/as.R (mpfr): as(, "mpfr") now uses mpfr() (mpfr): now also works for 'raw' and 'logical'; adding as(*,.) methods ==> x[.] <- NA should work * R/array.R (cbind, rbind): correct behavior when length/dims do not quite match. * R/array.R (dim<-): make work for NULL. * tests/matrix-ex.R: test these. * src/convert.c (d2mpfr, etc): PROTECT(.) all coerceVector()s. 2009-04-30 Martin Maechler * man/mpfr-class.Rd: mention sort(),.., duplicated(), ... 2009-04-13 Martin Maechler * src/convert.c (d2mpfr1_list, str2mpfr1_list): allow 'prec' to be a vector. * R/as.R (mpfr): now support mpfr(, prec) * src/convert.c (str2mpfr1_list): implement character |-> mpfr * src/utils.c (R_mpfr_set_default_prec, *_get_*): * R/array.R (cbind, rbind): also work when there are "character" * R/AllClasses.R (array_or_vector): only contain 'atomicVector' 2009-03-31 Martin Maechler * src/Makevars.win: add this after suggestions from Uwe 2009-02-06 Martin Maechler * R/Arith.R (Compare): add missing ', .Generic' to some methods. * tests/matrix-ex.R: testing 'A >= 3' etc 2009-02-02 Martin Maechler * R/array.R (cbind, rbind): new "..." methods for cbind(), rbind(), * R/AllClasses.R: using new "Mnumber" class * man/bind-methods.Rd: docu 2009-01-31 Martin Maechler * R/array.R (aperm): method. * R/AllClasses.R: 'Dimnames', not 'DimNames' * R/Arith.R: use .Arith.mpfr.num() macros etc, and make sure, these are used also in the o cases. * tests/matrix-ex.R: test array / mpfr 2009-01-27 Martin Maechler * R/array.R (.mpfrA.subset): if A[...] has length(dim(.))== 2, ensure it becomes an "mpfrMatrix" 2009-01-24 Martin Maechler * R/array.R (mpfrArray): make more (user friendly) like array() ([<-): render working also for A[i,j,k] <- val. (.mpfrA.subset): make A[,,1] working (.mA.subAssign): separate auxiliary function for more than 1 method 2009-01-22 Martin Maechler * src/Ops.c (Math_mpfr): activate (trunc,floor,ceiling) * tests/arith-ex.R: and test them minimally 2009-01-12 Martin Maechler * DESCRIPTION (Version): 0.1-1 -- another "snapshot" * R/array.R (t . mpfr): --> [ 1 x n ] - matrix * R/Arith.R (.dimCheck): add o methods, further o ones, etc. * tests/matrix-ex.R: testing them 2008-12-31 Martin Maechler * R/Math.R: slightly re-write methods so they automagically work for mpfrArray. * R/array.R (.matmult.R): %*%, crossprod(), tcrossprod(), t(), .. * tests/matrix-ex.R: new 2008-12-29 Martin Maechler * R/AllClasses.R: add "mpfrArray" and "mpfrMatrix" classes. * R/array.R (dim<-): from "mpfr" to "mpfrArray/Matrix" 2008-12-16 Martin Maechler * DESCRIPTION (Version): 0.1-0 -- "snapshot", not released. Rmpfr/.Rinstignore0000644000175000017500000000002211776116354014003 0ustar nileshnileshinst/doc/Makefile Rmpfr/configure0000755000175000017500000040502114136173547013416 0ustar nileshnilesh#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # 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 about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a 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= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="Rmpfr" ac_unique_file="DESCRIPTION" # 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='LTLIBOBJS LIBOBJS PKG_LDFLAGS PKG_CFLAGS PKG_CPPFLAGS EGREP GREP CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC 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 with_mpfr_include with_mpfr_lib ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # 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}' 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 this package 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/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-mpfr-include=INCLUDE_PATH the location of MPFR header files --with-mpfr-lib=LIB_PATH the location of MPFR libraries 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 CPP C preprocessor 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 the package provider. _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 configure 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_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_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;} ;; 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_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_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_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 cat >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 $as_me, 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 # Check whether --with-mpfr-include was given. if test "${with_mpfr_include+set}" = set; then : withval=$with_mpfr_include; mpfr_include_path=$withval fi if test -n "$mpfr_include_path" ; then MPFR_CPPFLAGS="-I${mpfr_include_path}" elif test -n "${mpfr_INCLUDE}" ; then MPFR_CPPFLAGS="-I${mpfr_INCLUDE}" fi # Check whether --with-mpfr-lib was given. if test "${with_mpfr_lib+set}" = set; then : withval=$with_mpfr_lib; mpfr_lib_path=$withval fi if test -n "$mpfr_lib_path" ; then MPFR_LDFLAGS="-L$mpfr_lib_path ${LDFLAGS}" elif test -n "${mpfr_LDFLAGS}" ; then MPFR_LDFLAGS="-L${mpfr_LDFLAGS} ${LDFLAGS}" fi : ${R_HOME=`R RHOME`} if test -z "${R_HOME}"; then echo "could not determine R_HOME" exit 1 fi CC=`"${R_HOME}/bin/R" CMD config CC` CFLAGS=`"${R_HOME}/bin/R" CMD config CFLAGS` CPPFLAGS=`"${R_HOME}/bin/R" CMD config CPPFLAGS` LDFLAGS=`"${R_HOME}/bin/R" CMD config LDFLAGS` 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 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 CPPFLAGS="${CPPFLAGS} ${MPFR_CPPFLAGS}" LDFLAGS="${LDFLAGS} ${MPFR_LDFLAGS}" PKG_CPPFLAGS=$CPPFLAGS PKG_CFLAGS=$CFLAGS PKG_LDFLAGS=$LDFLAGS { $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 # 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" "mpfr.h" "ac_cv_header_mpfr_h" "$ac_includes_default" if test "x$ac_cv_header_mpfr_h" = xyes; then : else as_fn_error $? "Header file mpfr.h not found; maybe use --with-mpfr-include=INCLUDE_PATH" "$LINENO" 5 fi ac_fn_c_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default" if test "x$ac_cv_header_gmp_h" = xyes; then : else as_fn_error $? "Header file gmp.h not found; maybe use --with-mpfr-include=INCLUDE_PATH" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init in -lgmp" >&5 $as_echo_n "checking for __gmpz_init in -lgmp... " >&6; } if ${ac_cv_lib_gmp___gmpz_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgmp $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 __gmpz_init (); int main () { return __gmpz_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gmp___gmpz_init=yes else ac_cv_lib_gmp___gmpz_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_gmp___gmpz_init" >&5 $as_echo "$ac_cv_lib_gmp___gmpz_init" >&6; } if test "x$ac_cv_lib_gmp___gmpz_init" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGMP 1 _ACEOF LIBS="-lgmp $LIBS" else as_fn_error $? "GNU MP not found, see README" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mpfr_init in -lmpfr" >&5 $as_echo_n "checking for mpfr_init in -lmpfr... " >&6; } if ${ac_cv_lib_mpfr_mpfr_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmpfr $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 mpfr_init (); int main () { return mpfr_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_mpfr_mpfr_init=yes else ac_cv_lib_mpfr_mpfr_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_mpfr_mpfr_init" >&5 $as_echo "$ac_cv_lib_mpfr_mpfr_init" >&6; } if test "x$ac_cv_lib_mpfr_mpfr_init" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBMPFR 1 _ACEOF LIBS="-lmpfr $LIBS" else as_fn_error $? "MPFR Library not found, see README" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mpfr_digamma in -lmpfr" >&5 $as_echo_n "checking for mpfr_digamma in -lmpfr... " >&6; } if ${ac_cv_lib_mpfr_mpfr_digamma+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmpfr $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 mpfr_digamma (); int main () { return mpfr_digamma (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_mpfr_mpfr_digamma=yes else ac_cv_lib_mpfr_mpfr_digamma=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_mpfr_mpfr_digamma" >&5 $as_echo "$ac_cv_lib_mpfr_mpfr_digamma" >&6; } if test "x$ac_cv_lib_mpfr_mpfr_digamma" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBMPFR 1 _ACEOF LIBS="-lmpfr $LIBS" else as_fn_error $? "MPFR Library must be at least version 3.0.0, see README" "$LINENO" 5 fi ac_config_files="$ac_config_files src/Makevars" 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}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.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 : "${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 $as_me, 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 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _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 Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status 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' 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;; --he | --h | --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 _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 "src/Makevars") CONFIG_FILES="$CONFIG_FILES src/Makevars" ;; *) 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 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" eval set X " :F $CONFIG_FILES " 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 # _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 $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 ;; 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 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 Rmpfr/R/0000755000175000017500000000000014136173461011701 5ustar nileshnileshRmpfr/R/Consts.R0000644000175000017500000000100112561376373013274 0ustar nileshnileshConst <- function(name = c("pi", "gamma", "catalan", "log2"), prec = 120L, rnd.mode = c('N','D','U','Z','A')) { stopifnot(is.numeric(prec)) if(is.na(i <- pmatch(name, eval(formals()$name)))) stop("'name' must be one of ", paste(paste("'",eval(formals()$name),"'",sep=""), collapse=", ")) new("mpfr", list(.Call(const_asMpfr, i, prec, match.arg(rnd.mode)))) } ## fails here; must happen *after* dyn.load, i.e. in ## ./zzz.R : Pi <- Const("pi") Rmpfr/R/Summary.R0000644000175000017500000000707214022105500013446 0ustar nileshnilesh#### Define mpfr methods for Summary group functions #### ======= ### "Math" are done in ./Math.R , "Ops", "Arith", "Logic", "Compare" in ./Arith.R .Summary.codes <- c("max" = 1, "min" = 2, "range" = 3, "prod" = 4, "sum" = 5, "any" = 10, "all" = 11) storage.mode(.Summary.codes) <- "integer" setMethod("Summary", "mpfr", function(x, ..., na.rm=FALSE) { iop <- .Summary.codes[.Generic] r <- .Call(Summary_mpfr, if(length(x)) c(x, ...) else x, na.rm, iop) if(iop <= 5) new("mpfr", r) else ## any, all : r }) stats__quantile.default <- stats:::quantile.default setMethod("quantile", "mpfr", stats__quantile.default) ## FIXME: is *slow* *and* uses double precision epsilon internally .Machine$double.epsilon ## ## Not perfect: has the "0%" "25%" "50%" ... names but not as slot ... hmm ... ## 'mpfr' numbers do not have 'names' slot ... (etc) -- but "work" with names ## function(x, ...) { ## if((match("names", names(list(...)), nomatch = 0L)) == 0L) ## stats__quantile.default(x, ..., names=FALSE) ## else ## ... contains 'names = ..' ## stats__quantile.default(x, ...) ## }) setMethod("mean", "mpfr", function(x, trim = 0, na.rm = FALSE, ...) { if(trim == 0) ## based on sum() : sum(x, na.rm=na.rm, ...) / length(x) else { ## cut'n'paste from mean.default() : if (!is.numeric(trim) || length(trim) != 1L || trim < 0) stop("'trim' must be numeric of length one, in [0, 1/2]") if (na.rm) x <- x[!is.na(x)] n <- length(x) if (anyNA(x)) mpfr(NA) else if (trim >= 0.5) quantile(x, probs = 0.5, na.rm = FALSE, names = FALSE) else { lo <- floor(n * trim) + 1 hi <- n + 1 - lo mean(sort(x, partial = unique(c(lo, hi)))[lo:hi], na.rm = FALSE) } } }) setMethod("median", "mpfr", function(x, na.rm=FALSE, ...) quantile(x, probs = 0.5, na.rm=na.rm, names = FALSE)) setMethod("summary", "mpfr", function (object, ..., digits, quantile.type = 7) { ## Should work almost like summary(asNumeric(object, ..., digits=digits)) ## *but* w/o underflow and overflow: nas <- is.na(object) object <- object[!nas] qq <- quantile(object, names=FALSE, type = quantile.type) qq <- c(qq[1L:3L], mean(object), qq[4L:5L]) ## names(qq) <- c("Min.", "1st Qu.", "Median", "Mean", "3rd Qu.", "Max.") if (!missing(digits)) qq <- signif(qq, digits) if(any(nas)) # names() updatingn works for "mpfr" qq <- c(qq, "NA's" = sum(nas)) ## loses names: as(qq, "summaryMpfr") ## workaround : new("summaryMpfr", qq, names = c("Min.", "1st Qu.", "Median", "Mean", "3rd Qu.", "Max.")) }) setClass("summaryMpfr", contains = "mpfr", slots = c(names = "character")) print.summaryMpfr <- function (x, digits=max(3L, getOption("digits") - 3L), ...) { xx <- x names(xx) <- NULL # will be lost anyway if(getRversion() >= "3.5.2") { ## for zapsmall() to work finite <- is.finite(xx) xx[finite] <- zapsmall(xx[finite]) } m <- match("NA's", names(xx), nomatch = 0L) xx <- if(m) c(format(xx[-m], digits = digits), `NA's` = as.character(xx[m])) else format(xx, digits = digits) names(xx) <- names(x) print.table(xx, digits = digits, ...) invisible(x) } setMethod(show, "summaryMpfr", function(object) print.summaryMpfr(object)) ## FIXME: can do this considerably faster in C: [which.max(): loc.(first TRUE)] setMethod("which.max", "mpfr", function(x) which.max(x == max(x))) setMethod("which.min", "mpfr", function(x) which.max(x == min(x))) Rmpfr/R/array.R0000644000175000017500000007701313752265550013156 0ustar nileshnilesh## From an "mpfr" object make an mpfr(Array|Matrix) : setMethod("dim", "mpfrArray", function(x) x@Dim) setMethod("dimnames", "mpfrArray", function(x) x@Dimnames) ## 2 basic methods to construct "mpfr - arrays" ( mpfrArray | mpfrMatrix ) : ##' "mpfr" --> "mpfrArray" --- basically dim() <- dd mpfr2array <- function(x, dim, dimnames=NULL, check=FALSE) { if(check) stopifnot(extends((clx <- class(x)), "mpfr")) if(is.numeric(dim) && all(dim == (iv <- as.integer(dim)))) { rnk <- length(iv) if(check) { cl <- if(rnk == 2) "mpfrMatrix" else "mpfrArray" if(extends(clx, "mpfrArray")) x <- as(x, "mpfr")# drop 'Dim', 'Dimnames' if(is.null(dimnames)) new(cl, x, Dim = iv) else new(cl, x, Dim = iv, Dimnames = dimnames) } else { ## faster, non-checking r <- setDataPart(new(if(rnk == 2) "mpfrMatrix" else "mpfrArray"), x, check=FALSE) r@Dim <- iv if(!is.null(dimnames)) r@Dimnames <- dimnames ##TODO R >= 2.13.2: ##TODO else if(.hasSlot(x, "Dimnames")) # has "wrong' Dimnames else if(is(x, "mpfrArray")) # has "wrong' Dimnames r@Dimnames <- rep.int(list(NULL), rnk) r } } else if(is.null(dim)) as.vector(x) else stop("invalid dimension specified") } setMethod("dim<-", signature(x = "mpfr", value = "ANY"), function(x, value) mpfr2array(x, value)) mpfrArray <- function(x, precBits, dim = length(x), dimnames = NULL, rnd.mode = c('N','D','U','Z','A')) { if(!is.atomic(x)) stop("'x' must be (coercable to) a numeric vector, possibly consider mpfr2array()") dim <- as.integer(dim) rnd.mode <- toupper(rnd.mode) rnd.mode <- match.arg(rnd.mode) ml <- .Call(d2mpfr1_list, x, precBits, rnd.mode) vl <- prod(dim) if (length(x) != vl) { if (vl > .Machine$integer.max) stop("'dim' specifies too large an array") ml <- rep(ml, length.out = vl) } new(if(length(dim) == 2) "mpfrMatrix" else "mpfrArray", ml, Dim = dim, Dimnames = if(is.null(dimnames)) vector("list", length(dim)) else dimnames) } setAs("array", "mpfr", function(from) mpfr(from, 128L)) setAs("array", "mpfrArray", function(from) mpfr(from, 128L)) setAs("matrix", "mpfrMatrix", function(from) mpfr(from, 128L)) ## and for "base" functions to work: as.array.mpfr <- function(x, ...) { if(is(x, "mpfrArray")) x else ## is(x, "mpfr") : as.array.default(x, ...) } as.matrix.mpfr <- function(x, ...) { if(is(x, "mpfrMatrix")) x else ## is(x, "mpfr") : as.matrix.default(x, ...) } ## matrix is S3 generic from 'gmp' anyway: matrix.mpfr <- function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, ...) { dim(data) <- c(nrow, ncol) if(length(dots <- list(...))) { if(!is.null(dn <- dots$dimnames)) { dimnames(data) <- dn # assign and delete from "dots": dots$dimnames <- NULL } if(nx <- length(dots)) # a simplified Matrix:::chk.s() warning(sprintf(ngettext(nx, "extra argument %s will be disregarded", "extra arguments %s will be disregarded"), sub(")$", '', sub("^list\\(", '', deparse(dots, control=c()))))) } data } setMethod("dimnames<-", signature(x = "mpfrArray", value = "ANY"), function(x, value) { if(!is.list(value)) stop("non-list RHS") if(length(value) != length(x@Dim)) stop("RHS (new dimnames) differs in length from dim(.)") x@Dimnames <- value x }) setMethod("t", "mpfrMatrix", t.mpfrMatrix <- function(x) { d <- x@Dim; n <- d[1]; m <- d[2] ## These are the indices to get the transpose of m {n x m} : ## ind.t <- function(n,m)rep.int(1:n, rep(m,n)) + n*(0:(m-1)) x@Dim <- c(m,n) x@Dimnames <- x@Dimnames[2:1] ## faster than { x@.Data <- x@.Data[rep.int(1:n, rep(m,n)) + n*(0:(m-1))] ; x } : setDataPart(x, getD(x)[rep.int(1:n, rep(m,n)) + n*(0:(m-1))], check=FALSE) }) setMethod("t", "mpfr", t.mpfr <- function(x) { # t() |--> {1 x n} matrix r <- new("mpfrMatrix") r@Dim <- c(1L, length(x)) ## faster than { r@.Data <- x@.Data ; r } : setDataPart(r, getD(x), check=FALSE) }) setMethod("aperm", signature(a="mpfrArray"), aperm.mpfrArray <- function(a, perm, resize=TRUE, ...) { stopifnot(1 <= (k <- length(d <- a@Dim))) if(missing(perm)) perm <- k:1 else stopifnot(length(perm <- as.integer(perm)) == k, 1 <= perm, perm <= k) if(!resize) stop("'resize != TRUE is not (yet) implemented for 'mpfrArray'") a@Dim <- d[perm] a@Dimnames <- a@Dimnames[perm] ii <- c(aperm(array(1:prod(d), dim=d), perm=perm, resize=FALSE)) ## faster than { a@.Data <- a@.Data[ ii ] ; a } : setDataPart(a, getD(a)[ ii ], check=FALSE) }) ## `` drop the dim() part '' : setMethod("as.vector", "mpfrArray", function(x) as(x, "mpfr")) ## a "vector" in *one* sense at least, and "mpfr" does extend "vector": setAs("mpfrArray", "vector", function(from) as(from, "mpfr")) .toNum <- function(from, rnd.mode) { ## <- must have only 'from' if(is.null(dn <- dimnames(from)) || identical(dn, list(NULL,NULL))) ## --> result has NULL dimnames structure(.Call(mpfr2d, from, rnd.mode), dim = dim(from)) else structure(.Call(mpfr2d, from, rnd.mode), dim = dim(from), dimnames = dn) } ## to be used in setAs(), must have only 'from' argument: .toNum1 <- function(from) .toNum(from, rnd.mode="N") toNum <- function(from, rnd.mode = c('N','D','U','Z','A')) { stopifnot(is.character(rnd.mode <- toupper(rnd.mode))) rnd.mode <- match.arg(rnd.mode) .toNum(from, rnd.mode) } setAs("mpfrArray", "array", .toNum1) setAs("mpfrMatrix", "matrix", .toNum1) setAs("mpfrArray", "matrix", function(from) { if(length(dim(from)) != 2) stop("dim(.) != 2 ==> cannot be coerced to 'matrix'") toNum(from) }) print.mpfrArray <- function(x, digits = NULL, drop0trailing = FALSE, right = TRUE, ## ----- ## would like 'drop0... = TRUE', but that's only ok once we have a ## format() allowing to "jointly format a column" max.digits = getOption("Rmpfr.print.max.digits", 999L), exponent.plus = getOption("Rmpfr.print.exponent.plus", TRUE), ...) { stopifnot(is(x, "mpfrArray"), is.null(digits) || digits >= 2) ## digits = NULL --> the inherent precision of x will be used n <- length(x) ch.prec <- if(n >= 1) { rpr <- range(.getPrec(x)) paste("of precision ", rpr[1], if(rpr[1] != rpr[2]) paste("..",rpr[2]), " bits") } cl <- class(x) p0 <- function(...) paste(..., sep="") cat(p0("'",cl,"'"), "of dim(.) = ", p0("(",paste(x@Dim, collapse=", "),")"), ch.prec, "\n") if(n >= 1) { ## FIXME: really need a 'format' method for mpfrArrays ## ----- which properly aligns columns !! ## Build character array fx, and print that ## drop arguments for print.default(*): lFormat <- function(x, na.print, print.gap, max, useSource, ...) formatMpfr(x, digits=digits, max.digits=max.digits, drop0trailing=drop0trailing, exponent.plus=exponent.plus, ...) fx <- lFormat(x, ...) dim(fx) <- dim(x) dimnames(fx) <- dimnames(x) print(fx, ..., right=right, quote = FALSE) } invisible(x) } setMethod(show, "mpfrArray", function(object) print.mpfrArray(object)) ## FIXME : should happen in C, where we could "cut & paste" much of ## ----- do_matprod() and matprod() from ~/R/D/r-devel/R/src/main/array.c ##/* "%*%" (op = 0), crossprod (op = 1) or tcrossprod (op = 2) */ .matmult.R <- function(x,y, op = 0L, fPrec = 1, precBits = fPrec * max(getPrec(x), getPrec(y))) { if(!(is.numeric(x) || is.mpfr(x))) stop("'x' must be numeric or mpfr(Matrix)") sym <- missing(y) if (sym && (op > 0L)) y <- x else if(!(is.numeric(y) || is.mpfr(y))) stop("'y' must be numeric or mpfr(Matrix)") ldx <- length(dx <- dim(x)) ldy <- length(dy <- dim(y)) ## "copy, paste & modify" from do_matprod(): if (ldx != 2 && ldy != 2) { #* x and y non-matrices */ if (op == 0L) { nrx <- 1L; ncx <- length(x) } else { nrx <- length(x); ncx <- 1L } nry <- length(y) ncy <- 1L } else if (ldx != 2) { #* x not a matrix */ nry <- dy[1] ncy <- dy[2] nrx <- ncx <- 0L if (op == 0L) { if (length(x) == nry) { #* x as row vector */ nrx <- 1L ncx <- nry # == length(x) } else if (nry == 1) { #* x as col vector */ nrx <- length(x) ncx <- 1L # == nry } } else if (op == 1L) { #* crossprod if (length(x) == nry) { #* x is a col vector */ nrx <- nry # = length(x) ncx <- 1L } } else { # op == 2L: tcrossprod if (length(x) == ncy) { #* x as row vector */ nrx <- 1L ncx <- ncy # == length(x) } else if (ncy == 1) { #* x as col vector */ nrx <- length(x) ncx <- 1L # == ncy } } } else if (ldy != 2) { #* y not a matrix */ nrx <- dx[1] ncx <- dx[2] nry <- ncy <- 0L if (op == 0L) { if (length(y) == ncx) { #* y as col vector */ nry <- ncx # = length(y) ncy <- 1L } else if (ncx == 1) { #* y as row vector */ nry <- 1L # = ncx ncy <- length(y) } } else if (op == 1L) { #* crossprod if (length(y) == nrx) { #* y is a col vector */ nry <- nrx # = length(y) ncy <- 1L } } else { # op == 2L: tcrossprod y is a col vector nry <- length(y) ncy <- 1L } } else { #* x and y matrices */ nrx <- dx[1] ncx <- dx[2] nry <- dy[1] ncy <- dy[2] } ##* nr[ow](.) and nc[ol](.) are now defined for x and y */ z <- new("mpfrMatrix") z0 <- as(0, "mpfr") if (op == 0L) { ## %*% if (ncx != nry) stop("non-conformable arguments") z@Dim <- c(nrx, ncy) z@.Data <- vector("list", nrx*ncy) if (nrx > 0 && ncx > 0 && nry > 0 && ncy > 0) { j <- 0L:(ncx - 1L) for(i in 1:nrx) { for (k in 0L:(ncy - 1L)) z[i + k * nrx] <- ## sum(x[i + j * nrx] * y[1L+ j + k * nry]) new("mpfr", .Call(R_mpfr_sumprod, # --> ../src/Summary.c x[i + j * nrx], y[1L+ j + k * nry], precBits, alternating=FALSE)) } } else #/* zero-extent operations should return zeroes */ for(i in seq_len(nrx*ncy)) z[i] <- z0 } else if (op == 1L) { ## crossprod() : x' %*% y if (nrx != nry) stop("non-conformable arguments") z@Dim <- c(ncx, ncy) z@.Data <- vector("list", ncx*ncy) if (nrx > 0 && ncx > 0 && nry > 0 && ncy > 0) { j <- 1L:nrx for(i in 0L:(ncx - 1L)) { for (k in 0L:(ncy - 1L)) z[1L +i + k * ncx] <- ## sum(x[j + i * nrx] * y[j + k * nry]) new("mpfr", .Call(R_mpfr_sumprod, x[j + i * nrx], y[j + k * nry], precBits, alternating=FALSE)) } } else for(i in seq_len(ncx*ncy)) z[i] <- z0 } else { ## op == 2L : tcrossprod() : x %*% y' if (ncx != ncy) stop("non-conformable arguments") z@Dim <- c(nrx, nry) z@.Data <- vector("list", nrx*nry) if (nrx > 0 && ncx > 0 && nry > 0 && ncy > 0) for(i in seq_len(nrx)) { j <- 0L:(ncx - 1L) for (k in 0L:(nry - 1L)) z[i + k * nrx] <- ## sum(x[i + j * nrx] * y[1L +k + j * nry]) new("mpfr", .Call(R_mpfr_sumprod, x[i + j * nrx], y[1L +k + j * nry], precBits, alternating=FALSE)) } else for(i in seq_len(nrx*nry)) z[i] <- z0 } z } ## .matmult.R() ## "FIXME"? make working also with "Matrix" class matrices .. ## ---------------------------- ## An 'explicit' %*% function (with >= 2 arguments) : matmult <- function(x,y, ...) .matmult.R(x,y, op = 0L, ...) setMethod("%*%", signature(x = "mpfrMatrix", y = "mpfrMatrix"), function(x,y) .matmult.R(x,y, op= 0L)) setMethod("%*%", signature(x = "mpfrMatrix", y = "mpfr"), function(x,y) .matmult.R(x,y, op= 0L)) setMethod("%*%", signature(x = "mpfr", y = "mpfrMatrix"), function(x,y) .matmult.R(x,y, op= 0L)) setMethod("%*%", signature(x = "mpfr", y = "mpfr"), function(x,y) .matmult.R(x,y, op= 0L)) ## These cover vectors, etc (!) : setMethod("%*%", signature(x = "mpfr", y = "Mnumber"), function(x,y) .matmult.R(x,y, op= 0L)) setMethod("%*%", signature(x = "Mnumber", y = "mpfr"), function(x,y) .matmult.R(x,y, op= 0L)) setMethod("crossprod", signature(x = "mpfrMatrix", y = "mpfrMatrix"), function(x,y, ...) .matmult.R(x,y, op= 1L, ...)) setMethod("crossprod", signature(x = "mpfrMatrix", y = "mpfr"), function(x,y, ...) .matmult.R(x,y, op= 1L, ...)) setMethod("crossprod", signature(x = "mpfr", y = "mpfrMatrix"), function(x,y, ...) .matmult.R(x,y, op= 1L, ...)) setMethod("crossprod", signature(x = "mpfr", y = "mpfr"), function(x,y, ...) .matmult.R(x,y, op= 1L, ...)) setMethod("crossprod", signature(x = "mpfr", y = "Mnumber"), function(x,y, ...) .matmult.R(x,y, op= 1L, ...)) setMethod("crossprod", signature(x = "Mnumber", y = "mpfr"), function(x,y, ...) .matmult.R(x,y, op= 1L, ...)) ## one argument-case: [FIXME: not copying 'x' and using x_i^2 is more efficient] setMethod("crossprod", signature(x = "mpfr", y = "missing"), function(x,y, ...) .matmult.R(x,x, op= 1L, ...)) setMethod("tcrossprod", signature(x = "mpfrMatrix", y = "mpfrMatrix"), function(x,y, ...) .matmult.R(x,y, op= 2L, ...)) setMethod("tcrossprod", signature(x = "mpfrMatrix", y = "mpfr"), function(x,y, ...) .matmult.R(x,y, op= 2L, ...)) setMethod("tcrossprod", signature(x = "mpfr", y = "mpfrMatrix"), function(x,y, ...) .matmult.R(x,y, op= 2L, ...)) setMethod("tcrossprod", signature(x = "mpfr", y = "mpfr"), function(x,y, ...) .matmult.R(x,y, op= 2L, ...)) setMethod("tcrossprod", signature(x = "mpfr", y = "Mnumber"), function(x,y, ...) .matmult.R(x,y, op= 2L, ...)) setMethod("tcrossprod", signature(x = "Mnumber", y = "mpfr"), function(x,y, ...) .matmult.R(x,y, op= 2L, ...)) ## one argument-case: [FIXME: not copying 'x' and using x_i^2 is more efficient] setMethod("tcrossprod", signature(x = "mpfr", y = "missing"), function(x,y, ...) .matmult.R(x,x, op= 2L, ...)) .mpfrA.subset <- function(x,i,j, ..., drop) { nA <- nargs() if(getOption("verbose")) message(sprintf("nargs() == %d mpfrArray indexing ... ", nA)) r <- getD(x) # the data part, a list() if(nA == 2) ## A[i] return(new("mpfr", r[i])) ## else: nA != 2 : nA > 2 - dim(r) <- dim(x) dimnames(r) <- dimnames(x) r <- r[i,j, ..., drop=drop] if(drop && is.null(dim(r))) new("mpfr", r) else { D <- if(is.null(dr <- dim(r))) # ==> drop is FALSE; can this happen? rep.int(1L, length(r)) else dr x@Dim <- D x@Dimnames <- if(is.null(dn <- dimnames(r))) vector("list", length(D)) else dn if(length(D) == 2 && class(x) != "mpfrMatrix") ## low-level "coercion" from mpfrArray to *Matrix : attr(x,"class") <- getClass("mpfrMatrix")@className attributes(r) <- NULL setDataPart(x, r, check=FALSE) } } ## "[" setMethod("[", signature(x = "mpfrArray", i = "ANY", j = "ANY", drop = "ANY"), .mpfrA.subset) ## this signature needs a method here, or it triggers the one for "mpfr" setMethod("[", signature(x = "mpfrArray", i = "ANY", j = "missing", drop = "missing"), .mpfrA.subset) .mA.subAssign <- function(x,i,j,..., value, n.a, isMpfr) { ## n.a :=== nargs() -- in the calling "[<-" method -- r <- getD(x) if(n.a >= 4) { ## A[i,j] / A[i,] / A[,j] but not A[i] ## A[i,j,k] <- v : n.a == 5 dim(r) <- dim(x) dimnames(r) <- dimnames(x) if(!isMpfr) value <- mpfr(value, precBits = pmax(getPrec(value), .getPrec(if(n.a == 4) r[i,j] else r[i,j, ...])) ) vD <- getD(value) if(n.a == 4) { r[i,j] <- vD } else { ## n.a >= 5 r[i, j, ...] <- vD } attributes(r) <- NULL } else if(n.a %in% c(2,3)) { ## A [ i ] <- v // A[] <- v if(!isMpfr) value <- mpfr(value, precBits = pmax(getPrec(value), .getPrec(r[i]))) if(n.a == 3L) r[i] <- value else ## n.a == 2: r[] <- value } else { ## n.a <= 1 stop(sprintf("nargs() == %d mpfrArray[i,j] <- value __ SHOULD NOT HAPPEN!", n.a)) } setDataPart(x, r, check=FALSE) }## .mA.subAssign ## "[<-" : ## ------- ## E.g., for A[1,,2] <- V ## these are to trigger before the ("mpfr", i,j, "mpfr") [ ./mpfr.R ] does for(it in c("ANY", "missing")) for(jt in c("ANY", "missing")) setReplaceMethod("[", signature(x = "mpfrArray", i = it, j = jt, value = "mpfr"), function(x,i,j,..., value) .mA.subAssign(x,i=i,j=j,...,value=value, n.a=nargs(), isMpfr = TRUE)) ## non-"mpfr" value for(it in c("ANY", "missing")) for(jt in c("ANY", "missing")) setReplaceMethod("[", signature(x = "mpfrArray", i = it, j = jt, value = "ANY"), function(x,i,j, ..., value) .mA.subAssign(x,i=i,j=j,...,value=value, n.a=nargs(), isMpfr = FALSE)) rm(it,jt) ## In the Matrix package we have Diagonal() for *constructing* a diagonalMatrix; ## in any case, we do only want to support the diag() case. setMethod("diag", signature(x = "mpfrMatrix"), function(x, nrow, ncol) { n <- min(dim(x)); i <- seq_len(n); x[cbind(i,i)] }) setMethod("diag<-", signature(x = "mpfrMatrix"), function(x, value) { n <- min(dim(x)); i <- seq_len(n); x[cbind(i,i)] <- value; x }) ###----------- setGeneric("cbind", signature = "...")# -> message about override & deparse.level setGeneric("rbind", signature = "...") ## inside such cbind() / rbind() S4 methods, match.call() does *not* work correctly, ## this works *only* for top-level calls : bind_match.call <- function() sys.call(1L) ## so use our "hack" : bind_match.call <- function() { nc <- length(scs <- sys.calls()) # last one is bind_match.call() itself ## want the one call *above* standardGeneric("...") : if(is.symbol(fn <- scs[[nc-1L]][[1L]])) { # e.g. 'cbind' Gcall <- call("standardGeneric", as.character(fn)) # e.g. standardGeneric("cbind") i. <- which(vapply(scs, identical, NA, Gcall)) scs[[if(!length(i.) || i. < 2L) 1L else i. - 1L ]] } else # try "better" match.call() } setMethod("cbind", "Mnumber", function(..., deparse.level = 1) { args <- list(...) if(all(vapply(args, is.atomic, NA))) return( base::cbind(..., deparse.level = deparse.level) ) ## else: at least one is "mpfr(Matrix/Array)" if(any(vapply(args, is.character, NA))) { ## result will be matrix ! isM <- vapply(args, is, NA, class2 = "mpfr") args[isM] <- lapply(args[isM], as, Class = "character") return(do.call(base::cbind, c(args, list(deparse.level=deparse.level)))) } else if(any(vapply(args, is.complex, NA))) { ## result will be matrix; ## in the future ??? stop("cbind(...) of 'complex' and 'mpfr' objects is not implemented") ## give at least warning !! } ## else L <- function(a) if(is.numeric(n <- nrow(a))) n else length(a) W <- function(a) if(is.numeric(n <- ncol(a))) n else 1L ## the number of rows of the result : {for now require integer} NR <- max(lengths <- vapply(args, L, integer(1))) NC <- sum(widths <- vapply(args, W, integer(1))) r <- setDataPart(new("mpfrMatrix"), vector("list", NR*NC)) r@Dim <- as.integer(c(NR, NC)) hasDim <- !vapply(args, function(a) is.null(dim(a)), NA) do.colnames <- deparse.level || any(hasDim) if(do.colnames) { nms <- character(NC) ## help(cbind) has in 'Value' : ## For ‘cbind’ (‘rbind’) the column (row) names are taken from the ## colnames (rownames) of the arguments if these are matrix-like. ## Otherwise from the names of the arguments or where those are not ## supplied and ‘deparse.level > 0’, by deparsing the expressions ## given, for ‘deparse.level = 1’ only if that gives a sensible name ## (a symbol, see is.symbol). nV <- names(widths) # == names(args), possibly NULL hasV <- !is.null(nV) ## argN <- substitute(...)## "fails" here same as match.call() fcall <- bind_match.call() if(!missing(deparse.level)) # must remove: it could be "anywhere" fcall <- fcall[names(fcall) != "deparse.level"] ## cat("fcall: "); str(fcall) ## browser() ## argN <- fcall[-1] # but that makes 1st arg into fn.name! ## vapply(fcall[-1], deparse1, "") ## is what we'd need, incl. *names* ## not ok when called as selectMethod("cbind","mpfr")(x, ....) fcall.ok <- (length(fcall) == 1L + ...length()) ## == 1 + length(args) } j <- 0 prec <- .Machine$double.digits for(ia in seq_along(args)) { w <- widths[ia] a <- args[[ia]] isM <- hasDim[[ia]] # == !is.null(dim(a)) ; true iff matrix-like if(is.mpfr(a)) { prec <- max(prec, .getPrec(a)) } else { ## not "mpfr" a <- mpfr(a, prec) } if((li <- lengths[ia]) != 1 && li != NR) { ## recycle if(isM) stop("number of rows of matrices must match") ## else if(NR %% li) warning("number of rows of result is not a multiple of vector length") a <- a[rep(seq_len(li), length.out = NR)] } ii <- j+ seq_len(w) r[, ii] <- a if(do.colnames) { nms[ii] <- if(isM) colnames(a) %||% "" else { if(hasV && nzchar(n. <- nV[[ia]])) n. else if(fcall.ok) { ## deparsed argument "arg"[[ia]] a <- fcall[[ia+1L]] if(is.symbol(a) || deparse.level == 2) deparse1(a) else "" } else "" } } j <- j + w } if(do.colnames && any(nzchar(nms))) r@Dimnames[[2L]] <- nms r }) setMethod("rbind", "Mnumber", function(..., deparse.level = 1) { args <- list(...) if(all(vapply(args, is.atomic, NA))) return( base::rbind(..., deparse.level = deparse.level) ) ## else: at least one is "mpfr(Matrix/Array)" if(any(vapply(args, is.character, NA))) { ## result will be matrix ! isM <- vapply(args, is, NA, class2 = "mpfr") args[isM] <- lapply(args[isM], as, Class = "character") return(do.call(base::rbind, c(args, list(deparse.level=deparse.level)))) } else if(any(vapply(args, is.complex, NA))) { ## result will be matrix; ## in the future ??? stop("rbind(...) of 'complex' and 'mpfr' objects is not implemented") ## give at least warning !! } ## else L <- function(a) if(is.numeric(n <- nrow(a))) n else 1L W <- function(a) if(is.numeric(n <- ncol(a))) n else length(a) ## the number of rows of the result : {for now require integer} NR <- sum(lengths <- vapply(args, L, integer(1))) NC <- max(widths <- vapply(args, W, integer(1))) r <- setDataPart(new("mpfrMatrix"), vector("list", NR*NC)) r@Dim <- as.integer(c(NR, NC)) hasDim <- !vapply(args, function(a) is.null(dim(a)), NA) do.rownames <- deparse.level || any(hasDim) if(do.rownames) { nms <- character(NR) nV <- names(lengths) # == names(args), possibly NULL hasV <- !is.null(nV) fcall <- bind_match.call() if(!missing(deparse.level)) # must remove: it could be "anywhere" fcall <- fcall[names(fcall) != "deparse.level"] ## not ok when called as selectMethod("cbind","mpfr")(x, ....) fcall.ok <- (length(fcall) == 1L + ...length()) ## == 1 + length(args) } i <- 0 prec <- .Machine$double.digits for(ia in seq_along(args)) { le <- lengths[ia] a <- args[[ia]] isM <- hasDim[[ia]] # == !is.null(dim(a)) ; true iff matrix-like if(is.mpfr(a)) { prec <- max(prec, .getPrec(a)) } else { ## not "mpfr" a <- mpfr(a, prec) } if((wi <- widths[ia]) != 1 && wi != NC) { ## recycle if(isM) stop("number of rows of matrices must match") ## else if(NC %% wi) warning("number of columns of result is not a multiple of vector length") a <- a[rep(seq_len(wi), length.out = NC)] } ii <- i+ seq_len(le) r[ii, ] <- a if(do.rownames) { nms[ii] <- if(isM) rownames(a) %||% "" else { if(hasV && nzchar(n. <- nV[[ia]])) n. else if(fcall.ok) { ## deparsed argument "arg"[[ia]] a <- fcall[[ia+1L]] if(is.symbol(a) || deparse.level == 2) deparse1(a) else "" } else "" } } i <- i + le } if(do.rownames && any(nzchar(nms))) r@Dimnames[[1L]] <- nms r }) unlistMpfr <- function(x, recursive = FALSE, use.names = TRUE) { ## an "unlist(.)" for mpfr contents: if(recursive) stop("'recursive = TRUE' is not implemented (yet).") n <- sum(lengths(x)) ans <- mpfr(numeric(n), precBits=3L)# dummy to fill ans@.Data <- unlist(lapply(x, slot, ".Data"), use.names=use.names) ans } ##-- Original in ~/R/D/r-devel/R/src/library/base/R/apply.R : ## applyMpfr <- function(X, MARGIN, FUN, ...) { FUN <- match.fun(FUN) ## Ensure that X is an array object dl <- length(dim(X)) if(!dl) stop("dim(X) must have a positive length") ##- if(is.object(X)) ##- X <- if(dl == 2L) as.matrix(X) else as.array(X) ## now record dim as coercion can change it ## (e.g. when a data frame contains a matrix). d <- dim(X) dn <- dimnames(X) ds <- seq_len(dl) ## Extract the margins and associated dimnames if (is.character(MARGIN)) { if(is.null(dnn <- names(dn))) # names(NULL) is NULL stop("'X' must have named dimnames") MARGIN <- match(MARGIN, dnn) if (any(is.na(MARGIN))) stop("not all elements of 'MARGIN' are names of dimensions") } s.call <- ds[-MARGIN] s.ans <- ds[MARGIN] d.call <- d[-MARGIN] d.ans <- d[MARGIN] dn.call<- dn[-MARGIN] dn.ans <- dn[MARGIN] ## dimnames(X) <- NULL array <- function(data, dim = length(data), dimnames = NULL) { dim(data) <- dim if(!is.null(dimnames)) dimnames(data) <- dimnames data } ## do the calls d2 <- prod(d.ans) if(d2 == 0L) { ## arrays with some 0 extents: return ``empty result'' trying ## to use proper mode and dimension: ## The following is still a bit `hackish': use non-empty X newX <- array(vector(typeof(X), 1L), dim = c(prod(d.call), 1L)) ans <- forceAndCall(1, FUN, if(length(d.call) < 2L) newX[,1] else array(newX[, 1L], d.call, dn.call), ...) return(if(is.null(ans)) ans else if(length(d.ans) < 2L) ans[1L][-1L] else array(ans, d.ans, dn.ans)) } ## else newX <- aperm(X, c(s.call, s.ans)) dim(newX) <- c(prod(d.call), d2) ans <- vector("list", d2) if(length(d.call) < 2L) {# vector if (length(dn.call)) dimnames(newX) <- c(dn.call, list(NULL)) for(i in 1L:d2) { tmp <- forceAndCall(1, FUN, newX[,i], ...) if(!is.null(tmp)) ans[[i]] <- tmp } } else for(i in 1L:d2) { tmp <- forceAndCall(1, FUN, array(newX[,i], d.call, dn.call), ...) if(!is.null(tmp)) ans[[i]] <- tmp } ## answer dims and dimnames ans.list <- !is(ans[[1L]], "mpfr") ##- is.recursive(ans[[1L]]) l.ans <- length(ans[[1L]]) ans.names <- names(ans[[1L]]) if(!ans.list) ans.list <- any(lengths(ans) != l.ans) if(!ans.list && length(ans.names)) { all.same <- vapply(ans, function(x) identical(names(x), ans.names), NA) if (!all(all.same)) ans.names <- NULL } len.a <- if(ans.list) d2 else length(ans <- unlistMpfr(ans)) if(length(MARGIN) == 1L && len.a == d2) { names(ans) <- if(length(dn.ans[[1L]])) dn.ans[[1L]] # else NULL ans } else if(len.a == d2) array(ans, d.ans, dn.ans) else if(len.a && len.a %% d2 == 0L) { if(is.null(dn.ans)) dn.ans <- vector(mode="list", length(d.ans)) dn1 <- list(ans.names) if(length(dn.call) && !is.null(n1 <- names(dn <- dn.call[1])) && nzchar(n1) && length(ans.names) == length(dn[[1]])) names(dn1) <- n1 dn.ans <- c(dn1, dn.ans) array(ans, c(len.a %/% d2, d.ans), if(!is.null(names(dn.ans)) || !all(vapply(dn.ans, is.null, NA))) dn.ans) } else ans } setGeneric("apply") setMethod ("apply", "mpfrArray", applyMpfr) setMethod("colSums", "mpfrArray", function(x, na.rm = FALSE, dims = 1, ...) { stopifnot((rnk <- length(dim(x))) >= 2, 1 <= dims, dims <= rnk - 1) applyMpfr(x, (dims+1):rnk, sum) }) setMethod("colMeans", "mpfrArray", function(x, na.rm = FALSE, dims = 1, ...) { stopifnot((rnk <- length(dim(x))) >= 2, 1 <= dims, dims <= rnk - 1) applyMpfr(x, (dims+1):rnk, mean) }) setMethod("rowSums", "mpfrArray", function(x, na.rm = FALSE, dims = 1, ...) { stopifnot((rnk <- length(dim(x))) >= 2, 1 <= dims, dims <= rnk - 1) applyMpfr(x, 1:dims, sum) }) setMethod("rowMeans", "mpfrArray", function(x, na.rm = FALSE, dims = 1, ...) { stopifnot((rnk <- length(dim(x))) >= 2, 1 <= dims, dims <= rnk - 1) applyMpfr(x, 1:dims, mean) }) ## Cut'n'paste from ~/R/Pkgs/Matrix/R/Auxiliaries.R {FIXME? load Matrix:::mkDet} mkDet <- function(d, logarithm = TRUE, ldet = sum(log(abs(d))), sig = -1L+2L*as.integer(prod(sign(d)) >= 0)) { # sig: -1 or +1 (not 0 !) modulus <- if (logarithm) ldet else exp(ldet) attr(modulus, "logarithm") <- logarithm val <- list(modulus = modulus, sign = sig) class(val) <- "det" val } ## S3 method instead of S4, as base::determinant is S3 generic determinant.mpfrMatrix <- function(x, logarithm = TRUE, asNumeric = (d[1] > 3), precBits = max(.getPrec(x)), ...) { d <- x@Dim if(d[1] != d[2]) stop("'x' must ba a square matrix") if((n <- d[1]) == 0) determinant(matrix(1,0,0), logarithm=logarithm) else if(n == 1) mkDet(x[1], logarithm=logarithm) else { ## n x n, for n >= 2 if(asNumeric) return(determinant(asNumeric(x), logarithm=logarithm, ...)) ## else use recursive (Care: horribly slow for non-small n!) Det <- function(x, n = dim(x)[1]) { if(n == 1) x[1] else if(n == 2) x[1]*x[4] - x[2]*x[3] else { a <- mpfr(numeric(n), precBits=3L) # dummy to fill n1 <- n-1L for(i in seq_len(n)) { a[i] <- Det(x[-i,-1], n=n1) } ## sum(x[,1] * a), faster : new("mpfr", .Call(R_mpfr_sumprod, x[,1], a, precBits, alternating=TRUE)) } } mkDet(Det(x, n=n), logarithm=logarithm) } } ## Only needed for S4 determinant(), not for S3 one: ## The ``Right Thing'' to do : ## base::det() calls [base::]determinant(); ## our det() should call our determinant() : ## det <- base::det ## environment(det) <- environment()## == asNamespace("Rmpfr") if(FALSE) { ## This will become easy, once we have outer(...) working, basically almost == ## base::.kronecker ~~~~~~~~~ ## ------^--------- setMethod("kronecker", signature(X = "mpfrMatrix", Y = "mpfrMatrix"), function (X, Y, FUN = "*", make.dimnames = FALSE, ...) { ydim <- Y@Dim rprec <- max(.getPrec(X),.getPrec(Y)) xx <- ....... mpfr2array(xx, dim = X@Dim * ydim) }) } scale.mpfrMatrix <- scale.default ## essential, so that colMeans() is using "our" colMeans : environment(scale.mpfrMatrix) <- environment()# = the "Rmpfr" namespace ### norm() - are "lifted" from ~/R/Pkgs/Matrix/R/sparseMatrix.R : ## "FIXME": ideally should be part of the setGenericImplicit("norm",..) setMethod("norm", signature(x = "ANY", type = "missing"), function (x, type, ...) norm(x, type = "O", ...)) setMethod("norm", signature(x = "mpfrMatrix", type = "character"), function(x, type, ...) { type <- toupper(substr(type[1], 1, 1)) switch(type, ## max(, 0) |--> 0 "O" = , "1" = max(colSums(abs(x)), 0), ## One-norm (L_1) "I" = max(rowSums(abs(x)), 0), ## L_Infinity "F" = sqrt(sum(x^2)), ## Frobenius "M" = max(abs(x), 0), ## Maximum modulus of all ## otherwise: stop("invalid 'type'")) }) setMethod("head", signature(x = "mpfrMatrix"), utils::head.matrix) setMethod("tail", signature(x = "mpfrMatrix"), utils::tail.matrix) ## Workaround fact that base::outer() using tcrossprod() does not dispatch (but did on %*% !?!?!?!) environment(outer) <- environment() # and export and document >> ../man/base-copies.Rd Rmpfr/R/integrate-Romberg.R0000644000175000017500000001077212402301607015375 0ustar nileshnilesh#### Romberg integration in pure R #### =================== ====== so it can be used with Rmpfr ## TODO: Lauren K would like to get return()ed all the intermediate sums as well ## ---- I agree: but only if 'all.sums = TRUE' integrateR <- function(f, lower, upper, ..., ord = NULL, rel.tol = .Machine$double.eps^0.25, abs.tol = rel.tol, max.ord = 19, verbose = FALSE) { stopifnot(length(lower) == 1, length(upper) == 1, is.finite(lower), is.finite(upper)) f <- match.fun(f) ff <- ## if(verbose) function(x) { cat("f(x), x="); str(x) ; f(x, ...) } else function(x) f(x, ...) null.ord <- is.null(ord) ## ord := Romberg order has.tol <- !missing(rel.tol) || !missing(abs.tol)# one of them specified if(chkConv <- (null.ord || has.tol)) { ## will use rel.tol and abs.tol if (abs.tol <= 0 && rel.tol < max(50 * .Machine$double.eps, 5e-29)) stop("invalid tolerance values") ## but need (maximal) order for Bauer's algorithm: } if(null.ord && !has.tol) { ## This is "approximate" (and too large, typically); but if it's ## too small, t[.] will be extended automatically: ord <- ## == max(3, min(25, ceiling(-log2(rel.tol)))) with default rel.tol 13 if(verbose) cat("ord =", ord, "(as no '*.tol' specified)\n") } useOrd <- !null.ord || !has.tol if(useOrd) { stopifnot(ord >= 0) if(verbose) cat(sprintf( " ord = %d; ==> evaluating integrand at %s 2^(ord+1)-2 = %d locations\n", ord, if(chkConv) "up to" else "", 2^(ord+1)-2)) } ### Bauer(1961) "Algorithm 60 -- Romberg Integration" Comm.ACM 4(6), p.255 m <- le <- upper - lower # 'l' ## a "hack", but really improves the result: if(!is.numeric(m)) { if(is(m, "mpfr")) { # should get *same* precision if(is.numeric(lower)) lower <- 0*m+ lower if(is.numeric(upper)) upper <- 0*m+ upper } else { ## other high-precision... if(is.numeric(lower)) lower <- as(lower, class(m)) if(is.numeric(upper)) upper <- as(upper, class(m)) } } t1 <- (ff(lower) + ff(upper))/2 t <- rep(t1, if(useOrd) ord+1 else 10)## <- must work for "mpfr" numbers one <- 1 + 0*t1 # for "mpfr" r. <- t[1]*le n <- 1 # 'n'(Bauer) = 2^n (Romberg Algo) if(verbose) { ## In "mpfr" case, cannot use sprintf("%g"); ## ==> rather use format(.) with higher number of digits prDigs <- max(10, min(50, 2 + ceiling(-log10(rel.tol)))) FORM <- paste0("n=%2d, 2^n=%9.0f | I = %",(5+prDigs), "s, abs.err =%14s\n") } h <- 1L repeat { if(verbose >= 2) { cat("range(le*t[1:h]):\n\t"); print(format(range(le*t[1:h]), digits=15), quote=FALSE) } u <- 0 m <- m/2 # == le/(2*n) ## here, we require f(.) to be vectorized: u <- sum(ff(lower+ seq(1, 2*n-1, by=2)*m)) t[h+1L] <- (u/n + t[h])/2 f. <- one for(j in h:1) { f. <- 4*f. t[j] <- t[j+1] + (t[j+1] - t[j])/ (f. - 1) } r <- t[1]*le aErr <- abs(r - r.) if(verbose) cat(sprintf(FORM, h, 2*n, format(r, digits = prDigs), format(aErr, digits = max(7, getOption("digits"))))) if(chkConv) { ## check if we converged: |r - r.| < min(.,.): *both* tolerances must be satisfied if(converged <- (aErr < min(abs(r)*rel.tol, abs.tol))) break } if((useOrd && h >= ord) || h >= max.ord) break r. <- r n <- 2*n # == 2^h h <- h+1L } if(chkConv && !converged) { relE <- format(aErr/abs(r), digits=getOption("digits")) msg <- paste0("no convergence up to order ", ord, "; last relative change = ", relE, "\n", "Consider setting 'ord = ' (e.g. = ", ord+1,").") warning(msg) } else msg <- "OK" r <- list(value = r, abs.error = aErr, subdivisions = 2*n+1, "message" = msg, call = match.call()) class(r) <- c("integrateR", "integrate") r } ## This is such that print.integrate() calls our format() method ## (and do *not* hide it via S3method() in NAMESPACE): ## print.integrate <- getS3method("print","integrate")# from 'stats' possibly not exported ## environment(print.integrate) <- environment() ## setMethod(show, "integrate", function(object) print.integrate(object)) print.integrateR <- function (x, digits = max(3, getOption("digits")-2), ...) { if(x[["message"]] != "OK") cat("Non-convergence message ", sQuote(x$message), "\n", sep = "") ## The "Ok" message: cat(format(x$value, digits = digits), " with absolute error < ", format(x$abs.error, digits=digits), "\n", sep = "") invisible(x) } setMethod(show, "integrateR", function(object) print.integrateR(object)) Rmpfr/R/zzz.R0000644000175000017500000000247714022105500012652 0ustar nileshnilesh## Not exported, and only used because CRAN checks must be faster doExtras <- function() { interactive() || nzchar(Sys.getenv("R_Rmpfr_check_extra")) || identical("true", unname(Sys.getenv("R_PKG_CHECKING_doExtras"))) } .onAttach <- function(libname, pkgname) { packageStartupMessage(sprintf("C code of R package 'Rmpfr': GMP using %d bits per limb\n", .mpfr_gmp_numbbits())) } .onLoad <- function(libname, pkgname) { if(mpfrVersion() < "3.0.0") warning("MPFR C library version ", format(mpfrVersion()), " is outdated, and minor functionality will be missing.\n", " Consider installing a newer version of MPFR (e.g., from mpfr.org),\n", " and re-install the R package Rmpfr after that.", call.=FALSE) } if(packageVersion("gmp") < "0.6-1") local({ ## need c_bigz() and c_bigq() already now env <- asNamespace("gmp") getGmp <- function(x) get(x, envir=env, inherits=FALSE) biginteger_c <- getGmp("biginteger_c") bigrational_c <- getGmp("bigrational_c") rm(env, getGmp) c_bigz <<- function(L) .Call(biginteger_c, L) c_bigq <<- function(L) .Call(bigrational_c, L) }) if(getRversion() < "4.0") { ## deparse(.) returning *one* string deparse1 <- function(expr, collapse = " ", width.cutoff = 500L, ...) paste(deparse(expr, width.cutoff, ...), collapse=collapse) } Rmpfr/R/mpfr.R0000644000175000017500000007373414127021566013004 0ustar nileshnilesh#### All methods for "mpfr" (and "mpfr1") class #### apart from coercions and the group methods setMethod("is.finite", "mpfr", function(x) .Call(R_mpfr_is_finite, x)) setMethod("is.infinite", "mpfr", function(x) .Call(R_mpfr_is_infinite, x)) ## MPFR has only "NaN" ( == "NA" -- hence these two are identical : setMethod("is.na", "mpfr", function(x) .Call(R_mpfr_is_na, x)) setMethod("is.nan", "mpfr", function(x) .Call(R_mpfr_is_na, x)) mpfrIs0 <- function(x) { if(is(x, "mpfrArray")) .Call(R_mpfr_is_zero_A, x) else .Call(R_mpfr_is_zero, x) ## sapply(x, function(.) .@exp == - .Machine$integer.max) } mpfr.is.0 <- function(x) { .Deprecated("mpfrIs0") mpfrIs0(x) } .mpfr.is.whole <- function(x) { if(is(x, "mpfrArray")) .Call(R_mpfr_is_integer_A, x) else .Call(R_mpfr_is_integer, x) } mpfr.is.integer <- function(x) { .Deprecated(".mpfr.is.whole") .mpfr.is.whole(x) } ## is.whole() is now S3 generic, with default method in gmp ## is.whole <- function(x) { ## if(is.integer(x) || is.logical(x)) rep.int(TRUE, length(x)) ## else if(is.numeric(x)) x == floor(x) ## else if(is.complex(x)) x == round(x) ## else if(is(x,"mpfr")) .mpfr.is.whole(x) ## else rep.int(FALSE, length(x)) ## } is.whole.mpfr <- function(x) .mpfr.is.whole(x) ## The above for "mpfrArray" : setMethod("is.finite", "mpfrArray", function(x) .Call(R_mpfr_is_finite_A, x)) setMethod("is.infinite", "mpfrArray", function(x) .Call(R_mpfr_is_infinite_A, x)) ## MPFR has only "NaN" ( == "NA" -- hence these two are identical : setMethod("is.na", "mpfrArray", function(x) .Call(R_mpfr_is_na_A, x)) setMethod("is.nan", "mpfrArray", function(x) .Call(R_mpfr_is_na_A, x)) mpfr_default_prec <- function(prec) { if(missing(prec) || is.null(prec)) .Call(R_mpfr_get_default_prec) else { stopifnot((prec <- as.integer(prec[1])) > 0) .Call(R_mpfr_set_default_prec, prec) } } .mpfr_minPrec <- function() .Call(R_mpfr_prec_range, 1L) .mpfr_maxPrec <- function() .Call(R_mpfr_prec_range, 2L) ## must be sync'ed with enum def. in R_mpfr_get_erange in ../src/utils.c .mpfr_erange_kinds <- c("Emin", "Emax", "min.emin", "max.emin", "min.emax", "max.emax") ## _erange_codes <- seq_along(.mpfr_erange_kinds) .mpfr_erange <- function(kind = c("Emin", "Emax"), names = TRUE) { if(anyNA(ikind <- match(kind, .mpfr_erange_kinds)) || !length(kind)) stop("'kind' must have entries from ", paste(paste0('"', .mpfr_erange_kinds, '"'), collapse=", ")) r <- .Call(R_mpfr_get_erange, ikind) if(names) names(r) <- .mpfr_erange_kinds[ikind] r } ## NB: This now works to set *both* kinds, simultaneously .mpfr_erange_set <- function(kind = c("Emin", "Emax"), value) { kind <- match.arg(kind, several.ok=TRUE) stopifnot(length(kind) == length(value)) ## value can be double, and need be for "64-bit long" invisible(vapply(seq_along(kind), function(j) .Call(R_mpfr_set_erange, match(kind[[j]], c("Emin", "Emax")), value[[j]]), ## returns error codes from MPFR; 0 is good integer(1)) == 0L) } .mpfr_erange_is_int <- function() .Call(R_mpfr_erange_int_p) .mpfr_gmp_numbbits <- function() .Call(R_mpfr_get_GMP_numb_bits) .mpfrVersion <- function() .Call(R_mpfr_get_version) mpfrVersion <- function() numeric_version(sub("^([0-9]+\\.[0-9]+\\.[0-9]+).*","\\1", .mpfrVersion())) print.mpfr1 <- function(x, digits = NULL, drop0trailing = TRUE, ...) { stopifnot(is(x, "mpfr1"), is.null(digits) || digits >= 1) cat("'mpfr1' ", format(as(x, "mpfr"), digits=digits, drop0trailing=drop0trailing), "\n", sep="") invisible(x) } setMethod(show, "mpfr1", function(object) print.mpfr1(object)) if(FALSE) ## no longer -- as R CMD check complains about use of non-API R_Outputfile ## For testing, debugging etc if(.Platform$OS.type != "windows") {## No R_Outputfile (in C) on Windows .print.mpfr <- function(x, digits = NA, ...) { stopifnot(is.mpfr(x), is.na(digits) || digits >= 1) ## digits = NA --> the inherent precision of x will be used if(length(x) >= 1) .Call(print_mpfr, x, as.integer(digits)) invisible(x) } }# non-Windows only ## a faster version of getDataPart(.) - as we *KNOW* we have a list ## !! If ever the internal representation of such S4 objects changes, this can break !! getD <- function(x) { attributes(x) <- NULL; x } getD <- function(x) `attributes<-`(x, NULL) ## Get or Set the C-global 'R_mpfr_debug_' variable: .mpfr_debug <- function(i = NA) .Call(R_mpfr_set_debug, as.integer(i)) ## CAREFUL: keep digits, max.digits, ... defaults in sync with ## print.mpfrArray() in ./array.R print.mpfr <- function(x, digits = NULL, drop0trailing = TRUE, right = TRUE, max.digits = getOption("Rmpfr.print.max.digits", 999L), exponent.plus = getOption("Rmpfr.print.exponent.plus", TRUE), ...) { stopifnot(is.mpfr(x), is.null(digits) || digits >= 1) ## digits = NULL --> the inherent precision of x will be used n <- length(x) ch.prec <- if(n >= 1) { rpr <- range(.getPrec(x)) paste("of precision ", rpr[1], if(rpr[1] != rpr[2]) paste("..",rpr[2]), " bits") } cat(n, "'mpfr'", if(n == 1) "number" else "numbers", ch.prec, "\n") if(n >= 1) { ## drop arguments for print.default(*): lFormat <- function(x, na.print, print.gap, max, useSource, ...) format(x, digits=digits, max.digits=max.digits, drop0trailing=drop0trailing, exponent.plus=exponent.plus, ...) print(lFormat(x, ...), ..., right=right, quote = FALSE) } invisible(x) } setMethod(show, "mpfr", function(object) print.mpfr(object)) ## Proposal by Serguei Sokol in order to make diag() work: if(FALSE)## << MM is in line with our "as.matrix" methods, but is extreme setMethod("is.matrix", "mpfr", function(x) length(dim(x)) == 2L) ## e.g. M0 <- (M <- cbind(mpfr(1.1, 100)^(98:99)))[,FALSE]; diag(M0) ## gives list() instead of length 0 mpfr ## For matrix indexing: matrix i |--> regular i : .mat2ind <- function(i, dim.x, dimnms.x) { ndx <- length(dim.x) if(!is.null(di <- dim(i))) { if(di[2L] == ndx) { ## k-column Matrix subsetting for array of rank k if(is.character(i)) { i <- vapply(seq_along(dim.x), function(j) match(i[,j], dimnms.x[[j]]), seq_len(di[1])) if(any(is.na(i))) stop("character matrix index out of limits") } i <- if(is.numeric(i)) i[,1L] + colSums(t(i[,-1L]-1L)* cumprod(dim.x)[-ndx]) else getD(i) } else { i <- getD(i) } } i } ## "[" which also keeps names ... JMC says that names are not support(ed|able) ## --- for such objects.. .mpfr.subset <- function(x,i,j, ..., drop) { nA <- nargs() if(nA == 2) { ## x[i] etc -- vector case -- to be fast, need C! -- ## i <- .mat2ind(i, dim(x), dimnames(x)) xd <- structure(getD(x)[i], names = names(x)[i]) if(any(iN <- vapply(xd, is.null, NA))) # e.g. i > length(x) xd[iN] <- mpfr(NA, precBits = 2L) ## faster than { x@.Data <- xd ; x }: setDataPart(x, xd, check=FALSE) } else if(nA == 3 && !is.null(d <- dim(x))) { ## matrix indexing(!) ## not keeping dimnames though ... message("nargs() == 3 'mpfr' array indexing ... ") new("mpfr", structure(getD(x)[i,j,...,drop=drop], dim = d)) ## keeping dimnames: maybe try ## D <- getD(x); dim(D) <- d ## if(!is.null(dn <- dimnames(x))) dimnames(D) <- dn ## D <- D[i,,drop=drop] ## new("mpfr", D) } else stop(gettextf("invalid 'mpfr' subsetting (nargs = %d)",nA)) } ## .mpfr.subset() .mpfr.msubset <- function(x,i,j, ..., drop) { nA <- nargs() if(nA == 2) { i <- .mat2ind(i, dim(x), dimnames(x)) xd <- structure(getD(x)[i], names=names(x)[i]) if(any(iN <- vapply(xd, is.null, NA))) # e.g. i > length(x) xd[iN] <- mpfr(NA, precBits = 2L) ## faster than { x@.Data <- xd ; x }: setDataPart(x[i], xd, check=FALSE) } else stop(gettext("invalid 'mpfr' matrix subsetting with a matrix (nargs = %d)",nA)) } ## .mpfr.msubset() ### ---------- FIXME: ./array.R has other "mpfrArray" methods for "[" and "[<-" !!!!!!----------- setMethod("[", signature(x = "mpfr", i = "ANY", j = "missing", drop = "missing"), .mpfr.subset) setMethod("[", signature(x = "mpfrArray", i = "matrix", j = "missing", drop = "missing"), .mpfr.msubset) setMethod("[[", signature(x = "mpfr", i = "ANY"), function(x,i) { if(length(i) > 1L) # give better error message than x@.Data[[i]] would: stop("attempt to select more than one element") xd <- getD(x)[[i]] # also gives error when i is "not ok" ## faster than { x@.Data <- list(xd) ; x } setDataPart(x, list(xd), check=FALSE) }) ## "[<-" : .mpfr.repl <- function(x, i, ..., value, check = TRUE) { if(length(list(...))) ## should no longer happen: stop("extra replacement arguments ", deparse(list(...)), " not dealt with") ## if(!missing(i)) i <- .mat2ind(i, dim(x), dimnames(x)) n <- length(xD <- getD(x)) xD[i] <- value if((nn <- length(xD)) > n+1) ## must "fill" the newly created NULL entries xD[setdiff((n+1):(nn-1), i)] <- mpfr(NA, precBits = 2L) setDataPart(x, xD, check=check) } ## FIXME: Should not need this; rather add .mat2ind to .mpfr.repl() above .mpfr.mrepl <- function(x, i, ..., value, check=TRUE) { if(length(list(...))) ## should no longer happen: stop("extra replacement arguments ", deparse(list(...)), " not dealt with") i <- .mat2ind(i, dim(x), dimnames(x)) n <- length(xD <- getD(x)) xD[i] <- value if((nn <- length(xD)) > n+1) ## must "fill" the newly created NULL entries xD[setdiff((n+1):(nn-1), i)] <- mpfr(NA, precBits = 2L) setDataPart(x, xD, check=check) } ## value = "mpfr" setReplaceMethod("[", signature(x = "mpfr", i = "ANY", j = "missing", value = "mpfr"), function(x, i, j, ..., value) .mpfr.repl(x, i, ..., value=value)) setReplaceMethod("[", signature(x = "mpfrArray", i = "matrix", j = "missing", value = "mpfr"), function(x, i, j, ..., value) .mpfr.mrepl(x, i, ..., value=value)) ## for non-"mpfr", i.e. "ANY" 'value', coerce to mpfr with correct prec: setReplaceMethod("[", signature(x = "mpfr", i = "missing", j = "missing", value = "ANY"), function(x,i,j, ..., value) .mpfr.repl(x, , value = mpfr(value, precBits = pmax(getPrec(value), .getPrec(x))))) setReplaceMethod("[", signature(x = "mpfr", i = "ANY", j = "missing", value = "ANY"), function(x,i,j, ..., value) { if(length(xi <- x[i])) .mpfr.repl(x, i, value = mpfr(value, precBits = pmax(getPrec(value), .getPrec(xi)))) else x # nothing to replace }) setReplaceMethod("[", signature(x = "mpfrArray", i = "matrix", j = "missing", value = "ANY"), function(x,i,j, ..., value) { if(length(xi <- x[i])) .mpfr.mrepl(x, i, value = mpfr(value, precBits = pmax(getPrec(value), .getPrec(xi)))) else x # nothing to replace }) ## I don't see how I could use setMethod("c", ...) ## but this works "magically" when the first argument is an mpfr : c.mpfr <- function(...) new("mpfr", unlist(lapply(list(...), as, Class = "mpfr"), recursive = FALSE)) ## and the same trick can be used to implement a *simplistic* sapplyMpfr <- function(X, FUN, ...) new("mpfr", unlist(lapply(X, FUN, ...), recursive = FALSE)) ##' more carefully, also returing mpfrArray when appropriate: sapplyMpfr <- function(X, FUN, ...) { L <- lapply(X, FUN, ...) if((n <- length(L)) && all((ll <- lengths(L)) == ll[1])) { if(is.null(d <- dim(L[1])) || !all(d == sapply(L, dim))) new("mpfrMatrix", unlist(L, recursive = FALSE), Dim = c(n,ll[1]), Dimnames = list(names(L), names(L[1]))) else # L[i] have dim(), all the same ones new("mpfrArray", unlist(L, recursive = FALSE), Dim = c(n,d), Dimnames = list(names(L), dimnames(L[1]))) } else { new("mpfr", unlist(L, recursive = FALSE)) } } ## duplicated() now works, checked in ../man/mpfr-class.Rd ## sort() works too (but could be made faster via faster ## ------ xtfrm() method ! [ TODO ] ## to have this also work *inside* base function factor(), we need S3 method {AARGH!} unique.mpfr <- function(x, incomparables = FALSE, ...) new("mpfr", unique(getD(x), incomparables, ...)) setMethod("unique", signature(x = "mpfr", incomparables = "ANY"), unique.mpfr) ## This is practically identical to grid's rep.unit : rep.mpfr <- function(x, times = 1, length.out = NA, each = 1, ...) ## Determine an appropriate index, then call subsetting code x[ rep(seq_along(x), times=times, length.out=length.out, each=each) ] setGeneric("pmin", signature = "...")# -> message about override ... setGeneric("pmax", signature = "...") ## Check if we should "dispatch" to base ## should be fast, as it should not slow down "base pmin() / pmax()" ## Semantically: <==> is.atomic(x) && !(is(x, "bigz") || is(x, "bigq")) pm.ok.base <- function(x, cld = getClassDef(class(x))) is.atomic(x) && (!is.object(x) || { !(extends(cld, "bigz") || extends(cld, "bigq")) }) setMethod("pmin", "mNumber", function(..., na.rm = FALSE) { args <- list(...) ## Fast(*) check if "base dispatch" should happen (* "fast" for base cases): ## if((allA <- all(vapply(args, is.atomic, NA))) && ## ((nonO <- !any(is.obj <- vapply(args, is.object, NA))) || ## { ## cld <- lapply(args, function(.) getClassDef(class(.))) ## cld.o <- cld[is.obj] ## all(vapply(cld.o, extends, NA, "bigz") | ## vapply(cld.o, extends, NA, "bigq")) })) if(all(vapply(args, pm.ok.base, NA))) return( base::pmin(..., na.rm = na.rm) ) ## else: at least one is "mpfr(Matrix/Array)", "bigz" or "bigq" ## if(!allA || nonO) cld <- lapply(args, function(.) getClassDef(class(.))) ## else have defined cld above is.m <- vapply(cld, extends, NA, "mpfr") is.q <- vapply(cld, extends, NA, "bigq") is.z <- vapply(cld, extends, NA, "bigz") is.N <- vapply(args, function(x) is.numeric(x) || is.logical(x), NA) if(!any(is.m | is.q | is.z)) # should not be needed -- TODO: "comment out" stop("no \"mpfr\", \"bigz\", or \"bigq\" argument -- wrong method chosen; please report!") N <- max(lenA <- lengths(args)) any.m <- any(is.m) any.q <- any(is.q) ## precision needed -- FIXME: should be *vector* mPrec <- max(unlist(lapply(args[is.m], .getPrec)),# not vapply if(any(vapply(args[!is.m], is.double, NA))) .Machine$double.digits, if(any.q) 128L,# arbitrary as in getPrec() unlist(lapply(args[is.z], function(z) frexpZ(z)$exp))# as in getPrec() ) ## to be the result : ## r <- mpfr(rep.int(Inf, N), precBits = mPrec) ## more efficient (?): start with the first 'mpfr' argument i.frst.m <- which.max(if(any.m) is.m else if(any.q) is.q else is.z) ## ==> r is "mpfr" if there's any, otherwise "bigq", or "bigz" r <- args[[i.frst.m]] if((n.i <- lenA[i.frst.m]) != N) r <- r[rep(seq_len(n.i), length.out = N)] ## modified from ~/R/D/r-devel/R/src/library/base/R/pmax.R has.na <- FALSE ii <- seq_along(lenA) ## = seq_along(args) ii <- ii[ii != i.frst.m] for(i in ii) { x <- args[[i]] if((n.i <- lenA[i]) != N) x <- x[rep(seq_len(n.i), length.out = N)] n.r <- is.na(r); n.x <- is.na(x) ## mpfr() is relatively expensive if(doM <- any.m && !is.m[i] && !is.N[i]) # "bigz", "bigq" ## r is "mpfr" x <- mpfr(x, precBits = mPrec) else if(doQ <- !any.m && !is.q[i] && !is.N[i]) # "bigz" ## r is "bigq" x <- as.bigq(x) if(has.na || (has.na <- any(n.r, n.x))) { r[n.r] <- x[n.r] x[n.x] <- if(!doM && !doQ) as(r[n.x],class(x)) else r[n.x] } change <- r > x change <- which(change & !is.na(change)) r[change] <- x[change] if (has.na && !na.rm) r[n.r | n.x] <- NA } ## wouldn't be ok, e.g for 'bigq' r and args[[1]]: ## mostattributes(r) <- attributes(args[[1L]]) ## instead : if(!is.null(d <- dim(args[[1L]]))) dim(r) <- d r })## end { pmin } setMethod("pmax", "mNumber", function(..., na.rm = FALSE) { args <- list(...) ## Fast(*) check if "base dispatch" should happen (* "fast" for base cases): ## if((allA <- all(vapply(args, is.atomic, NA))) && ## ((nonO <- !any(is.obj <- vapply(args, is.object, NA))) || ## { ## cld <- lapply(args, function(.) getClassDef(class(.))) ## cld.o <- cld[is.obj] ## all(vapply(cld.o, extends, NA, "bigz") | ## vapply(cld.o, extends, NA, "bigq")) })) if(all(vapply(args, pm.ok.base, NA))) return( base::pmax(..., na.rm = na.rm) ) ## else: at least one is "mpfr(Matrix/Array)", "bigz" or "bigq" ## if(!allA || nonO) cld <- lapply(args, function(.) getClassDef(class(.))) ## else have defined cld above is.m <- vapply(cld, extends, NA, "mpfr") is.q <- vapply(cld, extends, NA, "bigq") is.z <- vapply(cld, extends, NA, "bigz") is.N <- vapply(args, function(x) is.numeric(x) || is.logical(x), NA) if(!any(is.m | is.q | is.z)) # should not be needed -- TODO: "comment out" stop("no \"mpfr\", \"bigz\", or \"bigq\" argument -- wrong method chosen; please report!") N <- max(lenA <- lengths(args)) any.m <- any(is.m) any.q <- any(is.q) ## precision needed -- FIXME: should be *vector* mPrec <- max(unlist(lapply(args[is.m], .getPrec)),# not vapply if(any(vapply(args[!is.m], is.double, NA))) .Machine$double.digits, if(any.q) 128L,# arbitrary as in getPrec() unlist(lapply(args[is.z], function(z) frexpZ(z)$exp))# as in getPrec() ) ## to be the result : ## r <- mpfr(rep.int(Inf, N), precBits = mPrec) ## more efficient (?): start with the first 'mpfr' argument i.frst.m <- which.max(if(any.m) is.m else if(any.q) is.q else is.z) ## ==> r is "mpfr" if there's any, otherwise "bigq", or "bigz" r <- args[[i.frst.m]] if((n.i <- lenA[i.frst.m]) != N) r <- r[rep(seq_len(n.i), length.out = N)] ## modified from ~/R/D/r-devel/R/src/library/base/R/pmax.R has.na <- FALSE ii <- seq_along(lenA) ## = seq_along(args) ii <- ii[ii != i.frst.m] for(i in ii) { x <- args[[i]] if((n.i <- lenA[i]) != N) x <- x[rep(seq_len(n.i), length.out = N)] n.r <- is.na(r); n.x <- is.na(x) ## mpfr() is relatively expensive if(doM <- any.m && !is.m[i] && !is.N[i]) # "bigz", "bigq" ## r is "mpfr" x <- mpfr(x, precBits = mPrec) else if(doQ <- !any.m && !is.q[i] && !is.N[i]) # "bigz" ## r is "bigq" x <- as.bigq(x) if(has.na || (has.na <- any(n.r, n.x))) { r[n.r] <- x[n.r] x[n.x] <- if(!doM && !doQ) as(r[n.x],class(x)) else r[n.x] } change <- r < x change <- which(change & !is.na(change)) r[change] <- x[change] if (has.na && !na.rm) r[n.r | n.x] <- NA } ## wouldn't be ok, e.g for 'bigq' r and args[[1]]: ## mostattributes(r) <- attributes(args[[1L]]) ## instead : if(!is.null(d <- dim(args[[1L]]))) dim(r) <- d r })## end { pmax } ### seq() : ## seq.default() and seq.Date() as examples : ## ~/R/D/r-devel/R/src/library/base/R/seq.R and ## ~/R/D/r-devel/R/src/library/base/R/dates.R seqMpfr <- function(from = 1, to = 1, by = ((to - from)/(length.out - 1)), length.out = NULL, along.with = NULL, ...) { if(h.from <- !missing(from)) { lf <- length(from) if(lf != 1) stop("'from' must be of length 1") } if (nargs() == 1L && h.from) { # 'One' if(is.numeric(from) || is.mpfr(from)) { to <- from; from <- mpfr(1, getPrec(from)) } else stop("'from' is neither numeric nor \"mpfr\"") } ## else if (!is(from, "mpfr")) from <- as(from, "mpfr") if(!missing(to)) { if (!is.mpfr(to)) to <- as(to, "mpfr") if (length(to) != 1) stop("'to' must be of length 1") } if (!missing(along.with)) { length.out <- length(along.with) } else if (!is.null(length.out)) { if (length(length.out) != 1) stop("'length.out' must be of length 1") length.out <- asNumeric(ceiling(length.out)) } ## status <- c(!missing(to), !missing(by), !is.null(length.out)) ## if(sum(status) != 2) ## ## stop("exactly two of 'to', 'by' and 'length.out' / 'along.with' must be specified") ## warning("not exactly two of 'to', 'by' and 'length.out' / 'along.with' have been specified") miss.by <- missing(by) if(is.null(length.out)) { if(!is.mpfr(to)) to <- as(to, "mpfr") if(!is.mpfr(from)) from <- as(from, "mpfr")# need it again del <- to - from if(del == 0 && to == 0) return(to) if(miss.by) { by <- mpfr(sign(del), getD(from)[[1]]@prec) } } else if(!miss.by) { # to mpfr and check it if (!is.mpfr(by)) by <- as(by, "mpfr") if (length(by) != 1) stop("'by' must be of length 1") } ## ---- This is cut n paste from seq.default() : ## ---- It should work, since "arithmetic works for mpfr : if(is.null(length.out)) { n <- del/by if(!(length(n) && is.finite(n))) { if(length(by) && by == 0 && length(del) && del == 0) return(from) stop("invalid (to - from)/by in seq(.)") } if(n < 0) stop("wrong sign in 'by' argument") if(n > .Machine$integer.max) stop("'by' argument is much too small") dd <- abs(del)/max(abs(to), abs(from)) if (dd < 100*.Machine$double.eps) return(from) n <- as.integer(n + 1e-7) x <- from + (0:n) * by ## correct for overshot because of fuzz if(by > 0) pmin(x, to) else pmax(x, to) } else if(!is.finite(length.out) || length.out < 0) stop("length must be non-negative number") else if(length.out == 0) as(from,"mpfr")[FALSE] # of same precision ## else if (One) 1:length.out else if(miss.by) { ## if(from == to || length.out < 2) by <- 1 if(length.out < .Machine$integer.max) length.out <- as.integer(length.out) if(missing(to)) to <- as(from,"mpfr") + (length.out - 1) if(missing(from)) from <- to - (length.out - 1) if(length.out > 2) if(from == to) rep.int(as(from,"mpfr"), length.out) else { f <- as(from,"mpfr") as.vector(c(f, f + (1:(length.out - 2)) * by, to)) } else as.vector(c(as(from,"mpfr"), to))[seq_len(length.out)] } else if(missing(to)) as(from,"mpfr") + (0:(as.integer(length.out) - 1L)) * by else if(missing(from)) to - ((as.integer(length.out) - 1L):0) * by else stop("too many arguments") } ## {seqMpfr} if(FALSE) { ##-- --- I don't see *any* way to define seq() {S4} methods ## 1. Currently need a setGeneric() : ## ---- just calling setMethod("seq",...) as below fails directly {signature problem} ## 2. Trying three different variations --- all of them render the ## *default method invalid : ### ---> seq(1, length.out=3) # afterwards fails with " missing 'by' " setGeneric("seq", function(from, to, by, ...) standardGeneric("seq"), useAsDefault = function(from, to, by, ...) base::seq(from, to, by, ...)) setGeneric("seq", function(from, to, by, ...) standardGeneric("seq"), useAsDefault = function(from = 1, to = 1, by = ((to-from)/(length.out-1)), ...) base::seq(from, to, by, ...)) setGeneric("seq", function (from, to, by, length.out, along.with, ...) standardGeneric("seq"), signature = c("from", "to", "by"), useAsDefault = { function(from = 1, to = 1, by = ((to-from)/(length.out-1)), length.out = NULL, along.with = NULL, ...) base::seq(from, to, by, length.out=length.out, along.with=along.with, ...) }) setMethod("seq", c(from = "mpfr", to = "ANY", by = "ANY"), seqMpfr) setMethod("seq", c(from = "ANY", to = "mpfr", by = "ANY"), seqMpfr) setMethod("seq", c(from = "ANY", to = "ANY", by = "mpfr"), seqMpfr) }##--not yet-- defining seq() methods -- as it fails ## the fast mpfr-only version - should *not* return empty, hence the default: .getPrec <- function(x) { if(length(x)) vapply(getD(x), slot, 1L, "prec") else mpfr_default_prec() } ## binary exponents: [1] should be ok also for 64-bit limbs .getExp <- function(x) vapply(getD(x), function(m) m@exp[1L], 1) ##' The *relevant* number of "bit"/"digit" characters in character vector x ##' (i.e. is vectorized) .ncharPrec <- function(x, base) { if((base == 2 && any(i <- tolower(substr(x,1L,2L)) == "0b")) || (base == 16 && any(i <- tolower(substr(x,1L,2L)) == "0x"))) { i <- which(i) x[i] <- substr(x[i], 3L, 1000000L) } nchar(gsub("[-.]", '', x), "bytes") } ## the user version getPrec <- function(x, base = 10, doNumeric = TRUE, is.mpfr = NA, bigq. = 128L) { if(isTRUE(is.mpfr) || is.mpfr(x)) vapply(getD(x), slot, 1L, "prec")# possibly of length 0 else if(is.character(x)) { if (inherits(x, "Ncharacter")) attr(x, "bindigits") + 1L else ceiling(log2(base) * .ncharPrec(x, base)) ## number of digits --> number of bits } else if(is.logical(x)) 2L # even 1 would suffice - but need 2 (in C ?) else if(is.raw(x)) { if(is.object(x)) { ## Now deal with 'bigz' and 'bigq' if(inherits(x,"bigz")) frexpZ(x)$exp else if(inherits(x,"bigq")) { if(missing(bigq.)) { warning("default precision for 'bigq' arbitrarily chosen as ", bigq.) bigq. } else as.integer(bigq.) } else 8L } else 8L } else { if(!doNumeric) stop("must specify 'precBits' for numeric 'x' when 'doNumeric' is false") ## else if(is.integer(x)) 32L else if(is.double(x)) 53L else if(length(x) == 0) mpfr_default_prec() else stop(sprintf("cannot determine 'precBits' for x of type '%s'", typeof(x))) } } ### all.equal() ## TODO ?? <<<<<<<<<<< ## ==== ## 2) instead of as(., "mpfr") use mpfr(., precBits = ) ## For two "mpfr"s, use a "smart" default tolerance : setMethod("all.equal", signature(target = "mpfr", current = "mpfr"), function (target, current, tolerance = 2^-(0.5 * min(mean(.getPrec(target)), mean(.getPrec(current)))), ...) { ## to use "our" mean() : environment(all.equal.numeric) <- environment() all.equal.numeric(target, current, tolerance=tolerance, ...) }) setMethod("all.equal", signature(target = "mpfr", current = "ANY"), function (target, current, tolerance = .Machine$double.eps^0.5, ...) { ## to use "our" mean() : environment(all.equal.numeric) <- environment() all.equal.numeric(target, as(current, "mpfr"), tolerance=tolerance, ...) }) setMethod("all.equal", signature(target = "ANY", current = "mpfr"), function (target, current, tolerance = .Machine$double.eps^0.5, ...) { ## to use "our" mean() : environment(all.equal.numeric) <- environment() all.equal.numeric(as(target, "mpfr"), current, tolerance=tolerance, ...) }) ##' This is almost identical to diff.default -- ~/R/D/r-devel/R/src/library/base/R/diff.R ##' But that uses unclass(x) unfortunately diff.mpfr <- function(x, lag = 1L, differences = 1L, ...) { ismat <- is(x, "mpfrArray") ##_ is.matrix(x) xlen <- if(ismat) dim(x)[1L] else length(x) if (length(lag) > 1L || length(differences) > 1L || lag < 1L || differences < 1L) stop("'lag' and 'differences' must be integers >= 1") if (lag * differences >= xlen) return(x[0L]) # empty, but of proper mode i1 <- -seq_len(lag) if (ismat) for (i in seq_len(differences)) x <- x[i1, , drop = FALSE] - x[-nrow(x):-(nrow(x)-lag+1L), , drop = FALSE] else for (i in seq_len(differences)) x <- x[i1] - x[-length(x):-(length(x)-lag+1L)] x } str.mpfr <- function(object, nest.lev, internal = FALSE, give.head = TRUE, digits.d = 12, vec.len = NULL, drop0trailing=TRUE, width = getOption("width"), ...) { ## utils:::str.default() gives "Formal class 'mpfr' [package "Rmpfr"] with 1 slots" cl <- class(object) le <- length(object) if(le == 0) { print(object); return(invisible()) } if(isArr <- is(object, "mpfrArray")) di <- dim(object) r.pr <- range(getPrec(object)) onePr <- r.pr[1] == r.pr[2] if(give.head) cat("Class", " '", paste(cl, collapse = "', '"), "' [package \"", attr(cl, "package"), "\"] of ", if(isArr) paste("dimension", deparse(di, control = NULL)) else paste("length", le), " and precision", if(onePr) paste("", r.pr[1]) else paste0("s ", r.pr[1],"..",r.pr[2]), "\n", sep = "") if(missing(nest.lev)) nest.lev <- 0 cat(paste(rep.int(" ", max(0,nest.lev+1)), collapse= "..")) if(internal) { ## internal structure cat("internally @.Data: ") if(is.null(vec.len)) vec.len <- getOption("str", list(vec.len = 4))$vec.len str(getD(object), nest.lev=nest.lev, give.head=give.head, digits.d=digits.d, vec.len=vec.len, drop0trailing=drop0trailing, width=width, ...) return(invisible()) } ## if object is long, drop the rest which won't be used anyway: max.len <- max(100, width %/% 3 + 1, if(is.numeric(vec.len)) vec.len) if(le > max.len) object <- object[seq_len(max.len)] if(!is.null(digits.d))## reduce digits where precision is smaller: digits.d <- pmin(digits.d, ceiling(log(2)/log(10) * max(.getPrec(object)))) if(is.null(vec.len)) { # use width and precision (and remain simple enough) ff <- formatMpfr(object, digits=digits.d, drop0trailing=drop0trailing, ...) nch <- if(getRversion() >= "3.2.1") nchar(ff, keepNA=FALSE) else nchar(ff) fits <- !any(too.lrg <- cumsum(nch) + length(nch)-1L > width) if(!fits) vec.len <- max(2L, which.max(too.lrg) - 1L) } else fits <- le <= vec.len if(!fits) object <- object[seq_len(vec.len)] cat(formatMpfr(object, digits=digits.d, drop0trailing=drop0trailing, ...), if(fits) "\n" else "...\n") } ## {str.mpfr} Rmpfr/R/AllClasses.R0000644000175000017500000001347413735036657014074 0ustar nileshnilesh#### All Class Definitions in package "Rmpfr" ### Historically, we have used /usr/local/app/R/R_local/src/Brobdingnag/R/brob.R ### as partial role image ----------- ## NB: Most MPFR numbers are regular (C: mpfr_regular_p ) ## == ---> then 'd' is well defined. ## If they are not, i.e., it is in {0, NaN, +/- Inf}, then 'exp' shows this ## and 'd' (in mpfr a pointer to the limbs) is *not* used and not defined. ## Since Jan.2018, Rmpfr 0.7-0, we reflect this by using a 0-length 'd' slot setClass("mpfr1", ## a single Multi-precision float number slots = c(prec = "integer", # precision in bits exp = "integer", # exponent sign= "integer", # signum d = "integer"), # the mantissa as a vector of (32 bit) integers validity = function(object) { gmp.numb <- .mpfr_gmp_numbbits() # 32 or 64 if(length(pr <- object@prec) != 1 || is.na(pr) || pr < 2) "invalid 'prec' slot" else if((lex <- length(ex <- object@exp)) != 2 && gmp.numb == 64) "invalid 'exp' slot for 64-bit gmp.numbbits: must have length 2" else if(lex != 1 && gmp.numb == 32) "invalid 'exp' slot for 32-bit gmp.numbbits: must have length 1" else if(length(sig <- object@sign) != 1 || is.na(sig) || abs(sig) > 1) "'sign' slot not in {-1,1} is invalid" else { nd <- length(d <- object@d) if(nd) { ## "regular" need.d <- ceiling(pr / 32) if((gmp.numb == 32 && nd != need.d) || (gmp.numb == 64 && !any((nd - need.d) == 0:1))) "length('d' slot) does not match 'prec'" else TRUE } else ## not regular: valid if exp slot shows so if(gmp.numb == 64) { ## ex of length 2 if((is.na(ex[2]) && any(ex[[1]] == (1:3))) || ## mpfr 3.1.5, Fedora 26 (ex[1] == ex[2] && any(ex[1]+2^31 == 1:3))) ## mpfr 3.1.3, Windows TRUE else "'exp' slot invalid for non-regular number (64b, length(d) == 0)" } else { ## gmp.numb == 32: 'exp' slot of length one if(any(ex+2^31 == 1:3)) TRUE else "'exp' slot invalid for non-regular number (32b, length(d) == 0)" } } }) setClass("mpfr", ## a *vector* of "mpfr1", i.e., multi-precision float numbers contains = "list", ## of "mpfr1" entries: validity = function(object) { ## should be fast ( ==> not using is(., "mpfr1") ) : if(all(lengths(cls <- lapply(object@.Data, class)) == 1L) && all(unlist(cls) == "mpfr1")) return(TRUE) ## else "Not all components are of class 'mpfr1'" }) setClass("mpfrArray", ## mpfr + "dim" + dimnames contains = "mpfr", slots = c(Dim = "integer", Dimnames = "list"), prototype = prototype(new("mpfr"), Dim= 0L), validity = function(object) { if(length(object) != prod(D <- object@Dim)) "Dimension does not match length()" else if(length(DN <- object@Dimnames) != length(D)) "Dimnames must have same length as 'Dim'" else if(any(hasN <- !vapply(DN, is.null, NA)) && any(lengths(DN[hasN]) != D[hasN])) "length of some 'Dimnames' do not match 'Dim'" else TRUE }) setMethod("initialize", "mpfrArray", function(.Object, ..., Dim, Dimnames) { if(!missing(Dim)) .Object@Dim <- as.integer(Dim) k <- length(.Object@Dim) if(missing(Dimnames)) .Object@Dimnames <- rep(list(NULL), k) else if(length(Dimnames) != k) { message(sprintf("in initialize: length(Dimnames) != k = %d; setting to NULL",k)) .Object@Dimnames <- rep(list(NULL), k) } else .Object@Dimnames <- Dimnames callNextMethod() }) setClass("mpfrMatrix", contains = "mpfrArray", prototype = prototype(new("mpfrArray"), Dim= c(0L,0L), Dimnames = list(NULL, NULL)), validity = function(object) { if(length(object@Dim) != 2L) "'Dim' is not of length 2" else TRUE }) ## "atomic vectors" (-> ?is.atomic ) -- exactly as in "Matrix": ## --------------- setClassUnion("atomicVector", ## "double" is not needed, and not liked by some members = c("logical", "integer", "numeric", "complex", "raw", "character")) ## This is tricky ... ## With the following class, arrays/matrices are covered as ## they are also with "vector" already. *However*, they are ## *not* made into vectors in method dispatch, ## which they would be if we used simply "vector" setClassUnion("array_or_vector", members = c("array", "matrix", "atomicVector")) ## However (FIXME?), the above is too large: "matrix" extends "vector" ## and that has "character", "list", ... ## For this class, we want to define '...' methods for cbind & rbind : ## FIXME(?): "array_or_vector" also contains "character" ## (and even if it wouldn't, a "matrix" could have "character" entries!) setClassUnion("Mnumber", members = c("array_or_vector", # *but* must be numeric-like "mpfr", "mpfrArray", "mpfrMatrix", ## from package 'gmp' : "bigz", "bigq")) if(FALSE) { ## if we did this, then ... {see below} setValidity("Mnumber", function(object) { if(is.numeric(object) || is.logical(object) || is.mpfr(object)) return(TRUE) ## else "Not a valid 'Mnumber' class object" }) ## ...., then, the following would fail (!) validObject( new("character", LETTERS) ) } ###----- Simpler {without 'matrix' -> 'character' ...} ------------------------- ### setClassUnion("numericVector", members = c("logical", "integer", "numeric")) setClassUnion("mNumber", members = c("numericVector", "mpfr", "mpfrArray", "mpfrMatrix", ## from package 'gmp' : "bigz", "bigq")) setValidity("mNumber", function(object) { if(is.numeric(object) || is.logical(object) || is.mpfr(object)) return(TRUE) ## else "Not a valid 'mNumber' class object" }) Rmpfr/R/unirootR.R0000644000175000017500000001525213336100221013633 0ustar nileshnilesh### This is a translation of R_zeroin2 in ~/R/D/r-devel/R/src/appl/zeroin.c ### from C to R by John Nash, ### ---> file rootoned/R/zeroin.R of the new (2011-08-18) R-forge package rootoned ### ### Where John Nash calls it zeroin(), I call it unirootR() ##' Simple modification of uniroot() which should work with mpfr-numbers ##' MM: uniroot() is in ~/R/D/r-devel/R/src/library/stats/R/nlm.R ##' unirootR <- function(f, interval, ..., lower = min(interval), upper = max(interval), f.lower = f(lower, ...), f.upper = f(upper, ...), verbose = FALSE, tol = .Machine$double.eps^0.25, maxiter = 1000, warn.no.convergence = TRUE, epsC = NULL) { if(!missing(interval) && length(interval) != 2L) stop("'interval' must be a vector of length 2") ## For many "quick things", we will use as.numeric(.) but we do *NOT* assume that ## lower and upper are numeric! .N <- as.numeric if(.N(lower) >= .N(upper)) ##if(!is.numeric(lower) || !is.numeric(upper) || lower >= upper) stop("lower < upper is not fulfilled") if(is.na(.N(f.lower))) stop("f.lower = f(lower) is NA") if(is.na(.N(f.upper))) stop("f.upper = f(upper) is NA") if((ff <- f.lower * f.upper) >= 0) { if(ff > 0) stop("f() values at end points not of opposite sign") ## else ff == 0 <==> (at least) one of them is 0 if(f.lower == 0) return(list(root = lower, f.root = f.lower, iter = 0, estim.prec = tol)) ## else f.upper == 0 : return(list(root = upper, f.root = f.upper, iter = 0, estim.prec = tol)) } if(is.null(epsC) || is.na(epsC)) { ## determine 'epsC' ``the achievable Machine precision'' ## -- given the class of f.lower, f.upper if(is.double(ff)) epsC <- .Machine$double.eps else if(is(ff, "mpfr")) epsC <- 2^-min(getPrec(f.lower), getPrec(f.upper)) else { ## another number class -- try to see if getPrec() is defined.. ## if not, there's not much we can do if(is(prec <- tryCatch(min(getPrec(f.lower), getPrec(f.upper)), error = function(e)e), "error")) { warning("no valid getPrec() for the number class(es) ", paste(unique(class(f.lower),class(f.upper)), collapse=", "), ".\n Using double precision .Machine$double.eps.") epsC <- .Machine$double.eps } else { epsC <- 2^-prec message("using epsC = %s ..", format(epsC)) } } } if(tol < epsC) warning(sprintf("tol (%g) < epsC (%g) is rarely sensical, and the resulting precision is probably not better than epsC", tol, epsC)) ## Instead of the call to C code, now "do it in R" : ## val <- .Internal(zeroin2(function(arg) as.numeric(f(arg, ...)), ## lower, upper, f.lower, f.upper, ## tol, as.integer(maxiter))) a <- lower # interval[1] b <- upper # interval[2] fa <- f.lower # f(ax, ...) fb <- f.upper # f(bx, ...) if (verbose) cat(sprintf("Start zeroin: f(%g)= %g; f(%g)= %g\n", .N(a), .N(fa), .N(b), .N(fb))) c <- a fc <- fa ## First test if we have found a root at an endpoint maxit <- maxiter + 2 # count evaluations as maxiter-maxit converged <- FALSE while(!converged && maxit > 0) { ##---- Main iteration loop ------------------------------ if (verbose) cat("Top of iteration, maxit=",maxit,"\n") d.prev <- b-a ## Distance from the last but one to the last approximation */ ##double tol.2; ## Actual tolerance */ ##double p; ## Interpolation step is calcu- */ ##double q; ## lated in the form p/q; divi- ## * sion operations is delayed ## * until the last moment */ ##double d.new; ## Step at this iteration */ if(abs(fc) < abs(fb)) { ## Swap data for b to be the smaller if (verbose) cat("fc smaller than fb\n") a <- b b <- c c <- a ## best approximation fa <- fb fb <- fc fc <- fa } tol.2 <- 2*epsC*abs(b) + tol/2 if (verbose) cat("tol.2= ",.N(tol.2),"\n") d.new <- (c-b)/2 # bisection if (verbose) cat("d.new= ",.N(d.new),"\n") converged <- abs(d.new) <= tol.2 || fb == 0 if(converged) { if (verbose) cat("DONE! -- small d.new or fb=0\n") ## Acceptable approx. is found : val <- list(root=b, froot=fb, rtol = abs(c-b), maxit=maxiter-maxit) } else { ## Decide if the interpolation can be tried */ if( (abs(d.prev) >= tol.2) ## If d.prev was large enough*/ && (abs(fa) > abs(fb)) ) { ## and was in true direction, ## Interpolation may be tried */ ## register double t1,cb,t2; if (verbose) cat("d.prev larger than tol.2 and fa bigger than fb\n") cb <- c-b if (a == c) { ## If we have only two distinct points, linear interpolation ## can only be applied t1 <- fb/fa p <- cb*t1 q <- 1 - t1 if (verbose) cat("a == c\n") } else { ## Quadric inverse interpolation*/ if (verbose) cat("a != c\n") q <- fa/fc t1 <- fb/fc t2 <- fb/fa p <- t2 * ( cb*q*(q-t1) - (b-a)*(t1-1) ) q <- (q-1) * (t1-1) * (t2-1) } if(p > 0) { ## p was calculated with the */ if (verbose) cat(" p > 0; ") q <- -q ## opposite sign; make p positive */ } else { ## and assign possible minus to */ if (verbose) cat(" p <= 0; ") p <- -p ## q */ } if (p < 0.75*cb*q - abs(tol.2*q)/2 ## If b+p/q falls in [b,c]*/ && p < abs(d.prev*q/2)) { ## and isn't too large */ if (verbose) cat("p satisfies conditions for changing d.new\n") d.new <- p/q ## it is accepted } ## If p/q is too large, then the ## bisection procedure can reduce [b,c] range to more extent } if( abs(d.new) < tol.2) { ## Adjust the step to be not less*/ if (verbose) cat("d.new smaller than tol.2\n") if( d.new > 0 ) ## than tolerance */ d.new <- tol.2 else d.new <- -tol.2 } a <- b fa <- fb ## Save the previous approx. */ b <- b + d.new fb <- f(b, ...) maxit <- maxit-1 ## Do step to a new approxim. */ if( ((fb > 0) && (fc > 0)) || ((fb < 0) && (fc < 0)) ) { if (verbose) cat("make c to have sign opposite to b\n") ## Adjust c for it to have a sign opposite to that of b */ c <- a fc <- fa } }## else } ## end{ while(maxit > 0) } -------------------------------------------- if(converged) { iter <- val[["maxit"]] if(!is.na(fb) && abs(fb) > 0.5*max(abs(f.lower), abs(f.upper)))# from John Nash: warning("Final function magnitude seems large -- maybe converged to sign-changing 'pole' location?") } else { ## (!converged) : failed! val <- list(root= b, rtol = abs(c-b)) iter <- maxiter if(warn.no.convergence) warning("_NOT_ converged in ", iter, " iterations") } list(root = val[["root"]], f.root = f(val[["root"]], ...), iter = iter, estim.prec = .N(val[["rtol"]]), converged = converged) } Rmpfr/R/gmp-convert.R0000644000175000017500000000611213735036657014276 0ustar nileshnilesh#### Conversions bigz <-> mpfr // also bigq <--> mpfr if(packageVersion("gmp") < "0.5.8")## <-> ../NAMESPACE is.matrixZQ <- function(x) !is.null(attr(x, "nrow")) ## The following code is experimental, hence the "." : ### FIXME: we go via character.. which is not really efficient. ## ------ rather "should" use MPFR Functions ## int mpfr_set_z (mpfr_t ROP, mpz_t OP, mpfr_rnd_t RND) ## int mpfr_set_q (mpfr_t ROP, mpq_t OP, mpfr_rnd_t RND) ## ## Set the value of ROP from OP, rounded toward the given direction RND. ## ## Directly in C, we'd need both Rmpfr and gmp's C code (!) ## TODO(?: gmp should "export" its C++ API ( -> inst/include/*.hh ) ## and we should add 'LinkingTo: gmp' to DESCRIPTION and ## then use C++ with "C" { ...} for those parts .bigz2mpfr <- function(x, precB = NULL, rnd.mode = c('N','D','U','Z','A')) { stopifnot(inherits(x, "bigz")) ..bigz2mpfr(x, precB, rnd.mode) } ## Fast, no-checking (and not exported) version: ..bigz2mpfr <- function(x, precB = NULL, rnd.mode = c('N','D','U','Z','A')) ## precB: 4 == log2(16) = log(base) { stopifnot(is.character(rnd.mode <- toupper(rnd.mode))) rnd.mode <- match.arg(rnd.mode) b <- 16L cx <- .as.char.bigz(x, b) if(is.null(precB)) precB <- 4L*nchar(cx) if(is.matrixZQ(x)) new("mpfrMatrix", .Call(str2mpfr1_list, cx, precB, b, rnd.mode), Dim = as.integer(dim(x)))# "bigz" has no dimnames else new("mpfr", .Call(str2mpfr1_list, cx, precB, b, rnd.mode)) } setAs("bigz", "mpfr", function(from) ..bigz2mpfr(from)) ## FIXME: rather should use MPFR -- Function : ## ---- int mpfr_get_z (mpz_t ROP, mpfr_t OP, mpfr_rnd_t RND) ## Convert OP to a `mpz_t', after rounding it with respect to RND. .... ## FIXME(2): should 'gmp' change as.bigz into an S3 generic, so this becomes S3 method? as.bigz.mpfr <- .mpfr2bigz <- function(x, mod=NA) { if(is.null(mod)) mod <- NA_integer_ stopifnot(is.mpfr(x), is.na(mod) || (length(mod) == 1L && is.numeric(mod))) dx <- dim(x) ### FIXME or rather roundMpfr() [or even round "RND" as in mpfr_get_z() above] ?? cx <- format(trunc(x), drop0trailing=TRUE) dim(cx) <- dx ## needed?? {should *not* be, as in base R!} ..as.bigz(cx, mod) } setAs("mpfr", "bigz", function(from) .mpfr2bigz(from)) ## Fast, no-checking (and not exported) version: ..bigq2mpfr <- function(x, precB = NULL, rnd.mode = c('N','D','U','Z','A')) { stopifnot(is.character(rnd.mode <- toupper(rnd.mode))) rnd.mode <- match.arg(rnd.mode) N <- numerator(x) D <- denominator(x) if(is.null(precB)) { eN <- frexpZ(N)$exp eD <- frexpZ(D)$exp precB <- pmax(128L, eN + eD + 1L) # precision of result } ..bigz2mpfr(N, precB, rnd.mode) / ..bigz2mpfr(D, precB, rnd.mode) } .bigq2mpfr <- function(x, precB = NULL, rnd.mode = c('N','D','U','Z','A')) { stopifnot(inherits(x, "bigq")) ..bigq2mpfr(x, precB, rnd.mode) } setAs("bigq", "mpfr", function(from) ..bigq2mpfr(from)) ## TODO(?) "mpfr" -> "bigq" ## a) in the spirit MASS::fractions() or ## b) "native" MPFR "support" -- not yet available: has mpfr_get_z() but not get_q() Rmpfr/R/optimizers.R0000644000175000017500000001334513735036657014250 0ustar nileshnilesh## From: Hans W Borchers ## To: Martin Maechler ## Subject: optimizeR for Rmpfr ## Date: Sun, 3 Jun 2012 16:58:12 +0200 ## This is from Hans' pracma package, ## /usr/local/app/R/R_local/src/pracma/R/golden_ratio.R ## but there's also fibonacci search, direct1d, .... optimizeR <- function(f, lower, upper, ..., tol = 1e-20, method = c("Brent", "GoldenRatio"), maximum = FALSE, precFactor = 2.0, precBits = -log2(tol) * precFactor, maxiter = 1000, trace = FALSE) { stopifnot(length(lower) == 1, length(upper) == 1, lower <= upper) fun <- match.fun(f) f <- if(maximum) function(x) -fun(x, ...) else function(x) fun(x, ...) a <- if(!is.mpfr(lower)) mpfr(lower, precBits = precBits) else if(.getPrec(lower) < precBits) roundMpfr(lower, precBits) b <- if(!is.mpfr(upper)) mpfr(upper, precBits = precBits) else if(.getPrec(upper) < precBits) roundMpfr(upper, precBits) method <- match.arg(method) n <- 0; convergence <- TRUE ## if(method == "GoldenRatio") { switch(method, "GoldenRatio" = { ## golden ratio phi <- 1 - (sqrt(mpfr(5, precBits = precBits)) - 1)/2 x <- c(a, a + phi*(b-a), b - phi*(b-a), b) y2 <- f(x[2]) y3 <- f(x[3]) while ((d.x <- x[3] - x[2]) > tol) { n <- n + 1 if(trace && n %% trace == 0) message(sprintf("it.:%4d, delta(x) = %12.8g", n, as.numeric(d.x))) if (y3 > y2) { x[2:4] <- c(x[1]+phi*(x[3]-x[1]), x[2:3]) y3 <- y2 y2 <- f(x[2]) } else { x[1:3] <- c(x[2:3], x[4]-phi*(x[4]-x[2])) y2 <- y3 y3 <- f(x[3]) } if (n > maxiter) { warning(sprintf("not converged in %d iterations (d.x = %g)", maxiter, as.numeric(d.x))) convergence <- FALSE break } } xm <- (x[2]+x[3])/2 fxm <- if (abs(f. <- f(xm)) <= tol^2) 0. else f. }, "Brent" = { ##--- Pure R version (for "Rmpfr") of R's fmin() C code. ## The method used is a combination of golden section search and ## successive parabolic interpolation. convergence is never much slower ## than that for a Fibonacci search. If f has a continuous second ## derivative which is positive at the minimum (which is not at ax or ## bx), then convergence is superlinear, and usually of the order of ## about 1.324.... ## The function f is never evaluated at two points closer together ## than eps*abs(fmin)+(tol/3), where eps is the square ## root of 2^-precBits. if f is a unimodal ## function and the computed values of f are always unimodal when ## separated by at least eps*abs(x)+(tol/3), then fmin approximates ## the abcissa of the global minimum of f on the interval ax,bx with ## an error less than 3*eps*abs(fmin)+tol. if f is not unimodal, ## then fmin may approximate a local, but perhaps non-global, minimum to ## the same accuracy. ## This function subprogram is a slightly modified version of the ## Algol 60 procedure localmin given in Richard Brent, Algorithms for ## Minimization without Derivatives, Prentice-Hall, Inc. (1973). ## c is the squared inverse of the golden ratio c <- (3 - sqrt(mpfr(5, precBits = precBits))) / 2 eps <- 2^-precBits tol1 <- 1+eps # the smallest 1.000... > 1 eps <- sqrt(eps) w <- v <- x <- a + c * (b - a) fw <- fv <- fx <- f(x) d <- e <- 0 tol3 <- tol / 3 ## main loop starts here ----------------------------------- repeat { n <- n+1 xm <- (a + b) /2 tol1 <- eps * abs(x) + tol3 t2 <- tol1 * 2 ## check stopping criterion if (abs(x - xm) <= t2 - (d.x <- (b - a)/2)) break if (n > maxiter) { warning(sprintf("not converged in %d iterations (d.x = %g)", maxiter, as.numeric(d.x))) convergence <- FALSE break } p <- q <- r <- 0 if (abs(e) > tol1) { ## fit parabola r <- (x - w) * (fx - fv) q <- (x - v) * (fx - fw) p <- (x - v) * q - (x - w) * r q <- (q - r) * 2 if (q > 0) p <- -p else q <- -q r <- e; e <- d } if(doTr <- (trace && n %% trace == 0)) msg <- sprintf("it.:%4d, x = %-19.12g, delta(x) = %9.5g", n, as.numeric(x), as.numeric(d.x)) if (abs(p) >= abs(q/2 * r) || p <= q * (a - x) || p >= q * (b - x)) { ## a golden-section step e <- (if(x < xm) b else a) - x d <- c * e if(doTr) msg <- paste(msg, "+ Golden-Sect.") } else { ## a parabolic-interpolation step d <- p / q u <- x + d if(doTr) msg <- paste(msg, "+ Parabolic") ## f must not be evaluated too close to ax or bx if (u - a < t2 || b - u < t2) { d <- tol1 if (x >= xm) d <- -d } } if(doTr) message(msg) ## f must not be evaluated too close to x u <- x + if(abs(d) >= tol1) d else if(d > 0) tol1 else -tol1 fu <- f(u) ## update a, b, v, w, and x if (fu <= fx) { if (u < x) b <- x else a <- x v <- w; w <- x; x <- u fv <- fw; fw <- fx; fx <- fu } else { if (u < x) a <- u else b <- u if (fu <= fw || w == x) { v <- w; fv <- fw w <- u; fw <- fu } else if (fu <= fv || v == x || v == w) { v <- u; fv <- fu } } } ## end {repeat} main loop xm <- x; fxm <- fx }, ## end{ "Brent" } stop(sprintf("Method '%s' is not implemented (yet)", method))) c(if(maximum)list(maximum = xm) else list(minimum = xm), list(objective = fxm, iter = n, convergence = convergence, estim.prec = abs(d.x), method=method)) } Rmpfr/R/special-fun.R0000644000175000017500000005646414107223103014234 0ustar nileshnilesh## erf(), erfc() erf <- function(x) { if(is.numeric(x)) 2 * pnorm(x * sqrt(2)) - 1 else if(is.mpfr(x)) { # maybe also mpfrMatrix ##new("mpfr", .Call(Math_mpfr, x, .Math.codes[["erf"]])) x@.Data[] <- .Call(Math_mpfr, x, .Math.codes[["erf"]]) x } else stop("invalid class(x): ", class(x)) } ## pnorm(x* sqrt(2)) = (1 + erf(x))/2 ##==> pnorm(x.) = (1 + erf(x./sqrt(2)))/2 ## pnorm(x* sqrt(2), lower=FALSE) = erfc(x)/2 ##==> pnorm(x., lower=TRUE) = erfc(x./sqrt(2))/2 erfc <- function(x) { if(is.numeric(x)) 2 * pnorm(x * sqrt(2), lower.tail = FALSE) else if(is.mpfr(x)) { x@.Data[] <- .Call(Math_mpfr, x, .Math.codes[["erfc"]]) x } else stop("invalid class(x): ", class(x)) } pnorm <- function (q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE) { if(is.numeric(q) && is.numeric(mean) && is.numeric(sd)) stats__pnorm(q, mean, sd, lower.tail=lower.tail, log.p=log.p) else if((q.mp <- is.mpfr(q)) || is.mpfr(mean) || is.mpfr(sd)) { stopifnot(length(lower.tail) == 1L, length(log.p) == 1L) rr <- q <- ((if(q.mp) q else as(q, "mpfr")) - mean) / sd if(any(neg <- (q < 0))) ## swap those: Phi(-z) = 1 - Phi(z) rr[neg] <- pnorm(-q[neg], lower.tail = !lower.tail, log.p=log.p) if(any(pos <- !neg)) { q <- q[pos] #==> now q >= 0 prec.q <- max(.getPrec(q)) two <- mpfr(2, prec.q) rt2 <- sqrt(two) rr[pos] <- if(lower.tail) { if(log.p) { r <- q sml <- q < 0.67448975 if(any(sml)) { eq2 <- erf(q[sml]/rt2) ## |eq2| < 1/2 <==> |q/rt2| < 0.47693627620447 ## <==> sml <==> |q| < 0.67448975019608 r[ sml] <- log1p(eq2) - log(two) } if(any(!sml)) { ec2 <- erfc(q[!sml]/rt2) ## ==> ec2 = 1-eq2 <= 1 - 1/2 = 1/2 r[!sml] <- log1p(-0.5*ec2) } r } else ## !log.p (1 + erf(q/rt2))/2 } else { ## upper.tail r <- erfc(q/rt2) / 2 if(log.p) log(r) else r } } rr } else stop("(q,mean,sd) must be numeric or \"mpfr\"") }#{pnorm} dnorm <- function (x, mean = 0, sd = 1, log = FALSE) { if(is.numeric(x) && is.numeric(mean) && is.numeric(sd)) stats__dnorm(x, mean, sd, log=log) else if((x.mp <- is.mpfr(x)) || is.mpfr(mean) || is.mpfr(sd)) { ## stopifnot(length(log) == 1) prec <- pmax(53, getPrec(x), getPrec(mean), getPrec(sd)) if(!x.mp) x <- mpfr(x, prec) x <- (x - mean) / sd twopi <- 2*Const("pi", prec) ## f(x) = 1/(sigma*sqrt(2pi)) * exp(-1/2 x^2) if(log) ## log( f(x) ) = -[ log(sigma) + log(2pi)/2 + x^2 / 2] -(log(if(is.mpfr(sd)) sd else mpfr(sd, prec)) + (log(twopi) + x*x)/2) else exp(-x^2/2) / (sd*sqrt(twopi)) } else stop("invalid arguments (x,mean,sd)") } ## 'ncp': not yet -- checked in ../tests/special-fun-ex.R dt <- function (x, df, ncp, log = FALSE) { if(is.numeric(x) && is.numeric(df) && (missing(ncp) || is.numeric(ncp))) stats__dt(x, df, ncp, log=log) else if (missing(ncp) || all(ncp == 0)) { stopifnot(length(log) == 1) if((x.mp <- is.mpfr(x)) | (df.mp <- is.mpfr(df)) || missing(ncp) || is.mpfr(ncp)) { prec <- pmax(53L, getPrec(x), getPrec(df), if(missing(ncp)) 0L else getPrec(ncp)) if(! x.mp) x <- mpfr( x, prec) if(!df.mp) df <- mpfr(df, prec) twopi <- 2*Const("pi", prec) ## From Catherine Loader's comment in src/nmath/dt.c (n := df) : ## the following form should be "stable" ["contrary" to the direct formula]: ## ## f_n(x) = sqrt(n/2) / ((n+1)/2) * Gamma((n+3)/2) / Gamma((n+2)/2) ## * (1+x^2/n)^(-n/2) ## / sqrt( 2 pi (1+x^2/n) ) ## ## MM "FIXME": consider pkg 'DPQ's b_chi() and lb_chi() {and old c_nu()} ## --------- for the constant if(log) { log(df/2)/2 - log((df+1)/2) + lgamma((df+3)/2) - lgamma((df+2)/2) + (-df/2)*log1p(x^2/df) - log( twopi*(1+x^2/df) )/2 } else { sqrt(df/2) / ((df+1)/2) * gamma((df+3)/2) / gamma((df+2)/2) * (1+x^2/df)^(-df/2) / sqrt( twopi*(1+x^2/df) ) } } else stop("invalid arguments (x,df,ncp)") } else stop("ncp != 0 not yet implemented") } dpois <- function (x, lambda, log = FALSE, useLog = { ## MPFR overflow: ln2 <- log(2) any(lambda >= -.mpfr_erange("Emin")*ln2) || any(x*log(lambda) >= .mpfr_erange("Emax")*ln2) }) { if(is.numeric(x) && is.numeric(lambda)) ## standard R stats__dpois(x, lambda, log=log) else if((l.mp <- is.mpfr(lambda)) | (x.mp <- is.mpfr(x))) { prec <- pmax(53, getPrec(lambda), getPrec(x)) if(!l.mp) lambda <- mpfr(lambda, prec) if(!x.mp) x <- mpfr(x, prec) if(log || useLog) { ## NB: For large lambda, x ~= lambda this has a *LOT* of cancellation, e.g., for ## -- lambda = 1e100, prec = 256 is *NOT* sufficient !! r <- -lambda + x*log(lambda) - lfactorial(x) if(log) r else exp(r) } else exp(-lambda) * lambda^x / factorial(x) } else stop("(x,lambda) must be numeric or \"mpfr\"") } dbinom <- function(x, size, prob, log = FALSE, useLog = any(abs(x) > 1e6) || ## MPFR overflow: max(x*log(prob), (size-x)*log1p(-prob)) >= .mpfr_erange("Emax")*log(2)) { if(is.numeric(x) && is.numeric(size) && is.numeric(prob)) ## standard R stats__dbinom(x, size, prob, log=log) else if((s.mp <- is.mpfr(size)) | (p.mp <- is.mpfr(prob)) || is.mpfr(x)) { stopifnot(is.whole(x)) # R's dbinom() gives NaN's with a warning.. if(!is.integer(x)) x <- as.integer(x) # chooseMpfr() needs prec <- pmax(53, getPrec(size), getPrec(prob), getPrec(x)) if(!s.mp) size <- mpfr(size, prec) if(!p.mp) prob <- mpfr(prob, prec) ## n:= size, p:= prob, compute P(x) = choose(n, x) p^x (1-p)^(n-x) if(useLog) { # do *not* use chooseMpfr() {which is O(x^2)} lC.nx <- ## lchoose(size, x), but that is *not* yet available for "mpfr" __FIXME?__ lfactorial(size) - (lfactorial(x) + lfactorial(size-x)) } else { C.nx <- chooseMpfr(size, x) lC.nx <- log(C.nx) } if(log || useLog) { r <- lC.nx + x*log(prob) + (size-x)*log1p(-prob) if(log) r else exp(r) } else C.nx * prob^x * (1-prob)^(size-x) } else stop("(x,size, prob) must be numeric or \"mpfr\"") }## {dbinom} dnbinom <- function (x, size, prob, mu, log = FALSE, useLog = any(x > 1e6)) { if(!missing(mu)) { if (!missing(prob)) stop("'prob' and 'mu' both specified") ## Using argument 'mu' instead of 'prob' if (size == Inf) return( dpois(x, lambda=mu, log) ) else prob <- size/(size+mu) # and continue : } if(is.numeric(x) && is.numeric(size) && is.numeric(prob)) { ## standard R if(!missing(mu)) stats__dnbinom(x, size, mu=mu, log=log) else stats__dnbinom(x, size, prob=prob, log=log) } else if((s.mp <- is.mpfr(size)) | (p.mp <- is.mpfr(prob)) | (x.mp <- is.mpfr(x))) { stopifnot(is.whole(x)) # R's dbinom() gives NaN's with a warning.. if(!is.integer(x) && !useLog) x <- as.integer(x) # chooseMpfr() needs it prec <- pmax(53, getPrec(size), getPrec(prob), getPrec(x)) if(!s.mp) size <- mpfr(size, prec) if(!p.mp) prob <- mpfr(prob, prec) if(!x.mp && !is.integer(x)) x <- mpfr(x, prec) ## n:= size, p:= prob, compute P(x) = choose(n+x-1, x) * p^n * (1-p)^x if(!useLog) { C.nx <- chooseMpfr(size+x-1, x) if(log || ## MPFR overflow: max(size*log(prob), x*log1p(-prob)) >= .mpfr_erange("Emax")*log(2)) { r <- log(C.nx) + size*log(prob) + x*log1p(-prob) if(log) r else exp(r) } else C.nx * prob^size * (1-prob)^x } else { # x not integer, typically |x| > .Machine$integer.max (= 2147483647 = 2^31 - 1) ## => x is large but size >= x is even larger ... so everything is large ## FIXME (?) suffering from cancellation (when ?) ! logC.nx <- lgamma(size+x) - lgamma(size) - lgamma(x+1) if(log) logC.nx + size*log(prob) + x*log1p(-prob) else exp(logC.nx + size*log(prob) + x*log1p(-prob)) } } else stop("(x,size, prob | mu) must be numeric or \"mpfr\"") }## {dnbinom} dgamma <- function(x, shape, rate = 1, scale = 1/rate, log = FALSE) { missR <- missing(rate) missS <- missing(scale) if (!missR && !missS) { ## as stats::dgamma() if (abs(rate * scale - 1) < 1e-15) warning("specify 'rate' or 'scale' but not both") else stop("specify 'rate' or 'scale' but not both") } ## and now use 'scale' only if(is.numeric(x) && is.numeric(shape) && is.numeric(scale)) stats__dgamma(x, shape, scale=scale, log=log) else if((sh.mp <- is.mpfr(shape)) | (sc.mp <- is.mpfr(scale)) || is.mpfr(x)) { ## f(x)= 1/(s^a Gamma(a)) x^(a-1) e^-(x/s) ; a=shape, s=scale ## log f(x) = -a*log(s) - lgamma(a) + (a-1)*log(x) - (x/s) if(!sh.mp || !sc.mp) { prec <- pmax(53, getPrec(shape), getPrec(scale), getPrec(x)) if(!sh.mp) shape <- mpfr(shape, prec) else ## !sc.mp : scale <- mpfr(scale, prec) } ## for now, "cheap", relying on "mpfr" arithmetic to be smart ## "TODO": Use C.Loader's formulae via dpois_raw() , bd0() etc ## lgam.sh <- lgamma(shape) ## ldgamma <- function(x, shp, s) -shp*log(s) -lgam.sh + (shp-1)*log(x) - (x/s) ldgamma <- function(x, shp, s) -shp*log(s) -lgamma(shp) + (shp-1)*log(x) - (x/s) if(log) ldgamma(x, shape, scale) else { ## use direct [non - log-scale] formula when applicable ## ok <- lgam.sh < log(2) * Rmpfr:::.mpfr.erange("Emax") & ## finite gamma(shape) := exp(lgam.sh) ## is.finite(xsh1 <- x^(shape-1)) & ## !is.na(r <- xsh1 * exp(-(x/scale)) / (scale^shape * exp(lgam.sh))) ## r[!ok] <- exp(ldgamma(x[!ok], shape[!ok], scale[!ok])) ## r exp(ldgamma(x, shape, scale)) } } else stop("(x, shape, scale) must be numeric or \"mpfr\"") }## {dgamma} ## zeta() zeta <- function(x) { if(!inherits(x, "mpfr")) x <- as(x, "mpfr") # keep "mpfrArray" x@.Data[] <- .Call(Math_mpfr, x, .Math.codes[["zeta"]]) x } ## "FIXME" -- rather use 'bigq' in gmp and the "sumBin" algorithm from copula! Bernoulli <- function(k, precBits = 128) { ## Purpose: Bernoulli Numbers (in high precision) ## ----------------------------------------------------------- ## Arguments: k: non-negative integer vector ## ----------------------------------------------------------- ## Author: Martin Maechler, Date: 12 Dec 2008, 11:35 stopifnot(all(k >= 0), k == as.integer(k)) r <- - k * zeta(if(is.mpfr(k)) 1 - k else mpfr(1 - k, precBits=precBits)) if(any(k0 <- k == 0)) r[k0] <- mpfr(1, precBits=precBits) r } ## eint() "Exponential integral" Ei <- function(x) { if(!inherits(x, "mpfr")) x <- as(x, "mpfr") # keep "mpfrArray" x@.Data[] <- .Call(Math_mpfr, x, .Math.codes[["Eint"]]) x } ## Li_2() the dilogarithm Li2 <- function(x) { if(!inherits(x, "mpfr")) x <- as(x, "mpfr") # keep "mpfrArray" x@.Data[] <- .Call(Math_mpfr, x, .Math.codes[["Li2"]]) x } ### ------------- Bessel: --------- ## j0, j1, jn ## y0, y1, yn j0 <- function(x) { if(!inherits(x, "mpfr")) x <- as(x, "mpfr") # keep "mpfrArray" x@.Data[] <- .Call(Math_mpfr, x, .Math.codes[["j0"]]) x } j1 <- function(x) { if(!inherits(x, "mpfr")) x <- as(x, "mpfr") x@.Data[] <- .Call(Math_mpfr, x, .Math.codes[["j1"]]) x } y0 <- function(x) { if(!inherits(x, "mpfr")) x <- as(x, "mpfr") x@.Data[] <- .Call(Math_mpfr, x, .Math.codes[["y0"]]) x } y1 <- function(x) { if(!inherits(x, "mpfr")) x <- as(x, "mpfr") x@.Data[] <- .Call(Math_mpfr, x, .Math.codes[["y1"]]) x } Ai <- function(x) { if(!inherits(x, "mpfr")) x <- as(x, "mpfr") x@.Data[] <- .Call(Math_mpfr, x, .Math.codes[["Ai"]]) x } jn <- function(n, x, rnd.mode = c('N','D','U','Z','A')) { if(!inherits(x, "mpfr")) x <- as(x, "mpfr") x@.Data[] <- .Call(R_mpfr_jn, x, n, match.arg(rnd.mode)) x } yn <- function(n, x, rnd.mode = c('N','D','U','Z','A')) { if(!inherits(x, "mpfr")) x <- as(x, "mpfr") x@.Data[] <- .Call(R_mpfr_yn, x, n, match.arg(rnd.mode)) x } ###-------- 2-argument cases ------- ## We want to automatically construct the methods needed: ## But atan2() as argument list and signature (y, x) ## where beta() and lbeta() have (a,b) --> cannot treat them identically; ## and treat atan2() speparately ## NB: atan2(), beta() and lbeta() all have implicitGeneric()s in methods with no '...' ## == ---> canNOT have 3rd argument : rnd.mode = c('N','D','U','Z','A') ## ---> using "N" instead of match.arg(rnd.mode) setMethod("atan2", signature(y = "mpfr", x = "mpfr"), function(y, x) new("mpfr", .Call(R_mpfr_atan2, y, x, "N"))) setMethod("atan2", signature(y = "mpfr", x = "numeric"), function(y, x) new("mpfr", .Call(R_mpfr_atan2, y, .mpfr(x, 128L), "N"))) setMethod("atan2", signature(y = "numeric", x = "mpfr"), function(y, x) new("mpfr", .Call(R_mpfr_atan2, .mpfr(y, 128L), x, "N"))) setMethod("atan2", signature(y = "mpfr", x = "ANY"), function(y, x) new("mpfr", .Call(R_mpfr_atan2, y, as(x, "mpfr"), "N"))) setMethod("atan2", signature(y = "ANY", x = "mpfr"), function(y, x) new("mpfr", .Call(R_mpfr_atan2, as(y, "mpfr"), x, "N"))) setMethod("atan2", signature(y = "mpfrArray", x = "mpfrArray"), function(y, x) { if(dim(x) != dim(y)) stop("array dimensions differ") x@.Data[] <- .Call(R_mpfr_atan2, y, x, "N") x }) setMethod("atan2", signature(y = "mpfrArray", x = "ANY"), function(y, x) { if(length(y) %% length(x) != 0) stop("length of first argument (array) is not multiple of the second argument's one") y@.Data[] <- .Call(R_mpfr_atan2, y, if(is.numeric(x)) .mpfr(x, 128L) else as(x, "mpfr"), "N") y }) setMethod("atan2", signature(y = "ANY", x = "mpfrArray"), function(y, x) { if(length(x) %% length(y) != 0) stop("length of second argument (array) is not multiple of the first argument's one") x@.Data[] <- .Call(R_mpfr_atan2, if(is.numeric(y)) .mpfr(y, 128L) else as(y, "mpfr"), x, "N") x }) ## Using "macro" {instead of previous aux. function mpfrMath2setMeth.a.b() : for (ff in list(c("beta", "R_mpfr_beta"), c("lbeta", "R_mpfr_lbeta"))) eval(substitute( { setMethod(fname, signature(a = "mpfr", b = "mpfr"), function(a, b) new("mpfr", .Call(Csub, a, b, "N"))) setMethod(fname, signature(a = "mpfr", b = "numeric"), function(a, b) new("mpfr", .Call(Csub, a, .mpfr(b, 128L), "N"))) setMethod(fname, signature(a = "numeric", b = "mpfr"), function(a, b) new("mpfr", .Call(Csub, .mpfr(a, 128L), b, "N"))) setMethod(fname, signature(a = "mpfr", b = "ANY"), function(a, b) new("mpfr", .Call(Csub, a, as(b, "mpfr"), "N"))) setMethod(fname, signature(a = "ANY", b = "mpfr"), function(a, b) new("mpfr", .Call(Csub, as(a, "mpfr"), b, "N"))) setMethod(fname, signature(a = "mpfrArray", b = "mpfrArray"), function(a, b) { if(dim(b) != dim(a)) stop("array dimensions differ") b@.Data[] <- .Call(Csub, a, b, "N") b }) setMethod(fname, signature(a = "mpfrArray", b = "ANY"), function(a, b) { if(length(a) %% length(b) != 0) stop("length of first argument (array) is not multiple of the second argument's one") a@.Data[] <- .Call(Csub, a, if(is.numeric(b)) .mpfr(b, 128L) else as(b, "mpfr"), "N") a }) setMethod(fname, signature(a = "ANY", b = "mpfrArray"), function(a, b) { if(length(b) %% length(a) != 0) stop("length of second argument (array) is not multiple of the first argument's one") b@.Data[] <- .Call(Csub, if(is.numeric(a)) .mpfr(a, 128L) else as(a, "mpfr"), b, "N") b }) }, list(fname = ff[[1]], Csub = as.symbol(ff[[2]])))) ## hypot() hypot <- function(x,y, rnd.mode = c('N','D','U','Z','A')) { if(is(x, "mpfrArray") || is.array(x)) { if(is.array(x)) x <- mpfrArray(x, 128L, dim=dim(x), dimnames(x)) if(is.array(y)) y <- mpfrArray(y, 128L, dim=dim(y), dimnames(y)) if(is(y, "mpfrArray")) { if(dim(x) != dim(y)) stop("array dimensions differ") x@.Data[] <- .Call(R_mpfr_hypot, x, y, match.arg(rnd.mode)) x } else { ## y is not (mpfr)Array if(length(x) %% length(y) != 0) stop("length of first argument (array) is not multiple of the second argument's one") x@.Data[] <- .Call(R_mpfr_hypot, x, as(y, "mpfr"), match.arg(rnd.mode)) x } } else if(is(y, "mpfrArray")) { if(length(y) %% length(x) != 0) stop("length of second argument (array) is not multiple of the first argument's one") y@.Data[] <- .Call(R_mpfr_hypot, as(x, "mpfr"), y, match.arg(rnd.mode)) y } else new("mpfr", .Call(R_mpfr_hypot, as(x, "mpfr"), as(y, "mpfr"), match.arg(rnd.mode))) } ## The Beta(a,b) Cumulative Probabilities are exactly computable for *integer* a,b: pbetaI <- function(q, shape1, shape2, ncp = 0, lower.tail = TRUE, log.p = FALSE, precBits = NULL, useRational = !log.p && !is.mpfr(q) && is.null(precBits), rnd.mode = c('N','D','U','Z','A')) { stopifnot(length(shape1) == 1, length(shape2) == 1, is.whole(shape1), is.whole(shape2), shape1 >= 0, shape2 >= 0, length(lower.tail) == 1, length(log.p) == 1, 0 <= q, q <= 1, ncp == 0, is.null(precBits) || (is.numeric(precBits) && is.whole(precBits) && precBits >= 2)) ## Care for too large (a,b) and "integer overflow". ## NB: below have 0:(b - 1) or 0:(a - 1) max.ab <- 2^20 if(is.na(a <- as.integer(shape1)) || (!lower.tail && a > max.ab)) stop("a = shape1 is too large for 'lower.tail=FALSE' and the current algorithm") if(is.na(b <- as.integer(shape2)) || (lower.tail && b > max.ab)) stop("b = shape2 is too large for 'lower.tail=TRUE' and the current algorithm") n <- a + b - 1L if(!useRational) { pr.x <- getPrec(q, bigq. = 256L) if(is.null(precBits)) { aq <- abs(as.numeric(q)) mq <- if(any(po <- aq > 0)) min(aq[po]) else 1 # ==> log = 0 ## -n*log(|x|): such that 1 - |x|^n does not completely cancel precBits <- max(128L, pr.x, -as.numeric(n)*log(mq)) } if(pr.x < precBits || !is.mpfr(q)) q <- mpfr(q, precBits=precBits) mpfr1 <- list(.Call(const_asMpfr, 1, 16L, "N")) # as prototype for vapply() } F <- if(log.p) log else identity ## FIXME: logspace add sum lsum(.) should be more accurate for large n ==> could use larger a,b if(lower.tail) { ## The prob. is P[ X <= x ] = \sum_{k=a}^ n (n \\ k) x^k (1-x)^(n-k) ## but we want to sum from 0 {smallest --> largest} as well: ## P[ X <= x ] = \sum_{k=0}^{b-1} (n \\ k) (1-x)^k x^(n-k) k <- 0:(b - 1L) FUN.x <- function(x) sum(n.choose.k * (1-x)^k * x^(n-k)) } else { ## upper tail ## Prob. P[ X > q ] = 1 - P[X <= q ] = \sum_{k=0}^{a-1} (n \\ k) x^k (1-x)^(n-k) k <- 0:(a - 1L) FUN.x <- function(x) sum(n.choose.k * x^k * (1-x)^(n-k)) } n.choose.k <- chooseZ(n, k) if(useRational) { q <- as.bigq(q) if(length(q) == 1L) FUN.x(q) else c_bigq(lapply(q, FUN.x)) } else { # mpfr roundMpfr(F( ## "vapply() for "mpfr" new("mpfr", vapply(q, FUN.x, mpfr1))), ## reduce the precision, in order to not "claim wrongly": precBits=precBits, match.arg(rnd.mode)) } } ### MPFR version >= 3.2.0 : "https://www.mpfr.org/mpfr-current/mpfr.html#index-mpfr_005fgamma_005finc" ## ## >>> Note: the current implementation of mpfr_gamma_inc is slow for large values of rop or op, ## >>> ==== in which case some internal overflow might also occur. ## ## mpfr_gamma_inc(a,x) =: igamma(a,x) where ## ## igamma(a,x) = "upper" incomplete gamma Γ(a,x) :=: Γ(a) - γ(a,x); ## γ(a,x) = "lower" incomplete gamma γ(a,x) := ₀∫ˣ tᵃâ»Â¹ eâ»áµ— dt, and ## R's pgamma(x, a) :== γ(a,x) / Γ(a) ## ## >>> ../man/igamma.Rd <<< igamma <- function(a,x, rnd.mode = c('N','D','U','Z','A')) { if(mpfrVersion() < "3.2.0") stop("igamma()'s MPFR equivalent needs mpfr version >= 3.2.0, but mpfrVersion()=", mpfrVersion()) if(is(a, "mpfrArray") || is.array(a)) { if(is.array(a)) a <- mpfrArray(a, 128L, dim=dim(a), dimnames(a)) if(is.array(x)) x <- mpfrArray(x, 128L, dim=dim(x), dimnames(x)) if(is(x, "mpfrArray")) { if(dim(a) != dim(x)) stop("array dimensions differ") a@.Data[] <- .Call(R_mpfr_igamma, a, x, match.arg(rnd.mode)) a } else { ## x is not (mpfr)Array if(length(a) %% length(x) != 0) stop("length of first argument (array) is not multiple of the second argument's one") a@.Data[] <- .Call(R_mpfr_igamma, a, as(x, "mpfr"), match.arg(rnd.mode)) a } } else if(is(x, "mpfrArray")) { if(length(x) %% length(a) != 0) stop("length of second argument (array) is not multiple of the first argument's one") x@.Data[] <- .Call(R_mpfr_igamma, as(a, "mpfr"), x, match.arg(rnd.mode)) x } else new("mpfr", .Call(R_mpfr_igamma, as(a, "mpfr"), as(x, "mpfr"), match.arg(rnd.mode))) } ## only as long as we still may have mpfrVersion() < "3.2.0", e.g. in Fedora 30 (2019f) ## mpfrVersion() cannot be called at package build time (underlying C entry point not ready): ## if(mpfrVersion() < "3.2.0") ## dummy .. to pacify "R CMD check" ## R_mpfr_igamma <- quote(dummy) # gives NOTE ‘R_mpfr_igamma’ is of class "name" ## These are identical from package copuula/R/special-func.R -- where MM authored the function also: ## We want to export these, but cannot easily import from copula which "weekly depends" on Rmpfr ##' @title Compute f(a) = log(1 - exp(-a)) stably ##' @param a numeric vector of positive values ##' @param cutoff log(2) is optimal, see Maechler (201x) ..... ##' @return f(a) == log(1 - exp(-a)) == log1p(-exp(-a)) == log(-expm1(-a)) ##' @author Martin Maechler, May 2002 .. Aug. 2011 ##' @references Maechler(2012) ##' Accurately Computing log(1 - exp(-|a|)) Assessed by the Rmpfr package. ##' http://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf ## MM: ~/R/Pkgs/Rmpfr/inst/doc/log1mexp-note.Rnw ##--> ../man/log1mexp.Rd log1mexp <- function(a, cutoff = log(2)) ## << log(2) is optimal >> { if(has.na <- any(ina <- is.na(a))) { y <- a a <- a[ok <- !ina] } if(any(a < 0))## a == 0 --> -Inf (in both cases) warning("'a' >= 0 needed") tst <- a <= cutoff r <- a r[ tst] <- log(-expm1(-a[ tst])) r[!tst] <- log1p(-exp(-a[!tst])) if(has.na) { y[ok] <- r ; y } else r } ##' @title Compute f(x) = log(1 + exp(x)) stably and quickly ##--> ../man/log1mexp.Rd log1pexp <- function(x, c0 = -37, c1 = 18, c2 = 33.3) { if(has.na <- any(ina <- is.na(x))) { y <- x x <- x[ok <- !ina] } r <- exp(x) if(any(i <- c0 < x & (i1 <- x <= c1))) r[i] <- log1p(r[i]) if(any(i <- !i1 & (i2 <- x <= c2))) r[i] <- x[i] + 1/r[i] # 1/exp(x) = exp(-x) if(any(i3 <- !i2)) r[i3] <- x[i3] if(has.na) { y[ok] <- r ; y } else r } Rmpfr/R/Math.R0000644000175000017500000002617714026150166012725 0ustar nileshnilesh#### Define mpfr methods for Math and Math2 group functions #### ====== ===== ### "Arith", "Compare",..., are in ./Arith.R ### ---- ~~~~~~~ ## [1] "abs" "sign" "sqrt" "ceiling" "floor" "trunc" "cummax" ## [8] "cummin" "cumprod" "cumsum" "exp" "expm1" "log" "log10" ##[15] "log2" "log1p" "cos" "cosh" "sin" "sinh" "tan" ##[22] "tanh" "acos" "acosh" "asin" "asinh" "atan" "atanh" ##[29] "gamma" "lgamma" "digamma" "trigamma" if(FALSE) ## here are the individual function dput(getGroupMembers("Math")) ## Uniform interface to C: ## ## Pass integer code to call and do the rest in C ## Codes from ~/R/D/r-devel/R/src/main/names.c : .Math.codes <- c( "floor" = 1, "ceiling" = 2, "sqrt" = 3, "sign" = 4, "exp" = 10, "expm1" = 11, "log1p" = 12, "cos" = 20, "sin" = 21, "tan" = 22, "acos" = 23, "asin" = 24, "cosh" = 30, "sinh" = 31, "tanh" = 32, "acosh" = 33, "asinh" = 34, "atanh" = 35, "lgamma" = 40, "gamma" = 41, "digamma" = 42, "trigamma" = 43, ## R >= 3.1.0 : "cospi" = 47, "sinpi" = 48, "tanpi" = 49 ) .Math.gen <- getGroupMembers("Math") ## Those "Math" group generics that are not in the do_math1 table above .Math.codes <- c(.Math.codes, "trunc" = 0, "atan" = 25, # "abs" has own method! "log" = 13, "log2" = 14, "log10" = 15, "cummax" = 71, "cummin" = 72, "cumprod" = 73, "cumsum" = 74, ## These are *NOT* in R's Math group, but 1-argument math functions ## available in the mpfr - library: "erf" = 101, "erfc" = 102, "zeta" = 104, "Eint" = 106, "Li2" = 107, "j0" = 111, "j1" = 112, "y0" = 113, "y1" = 114, "Ai" = 120 # Airy function (new in mpfr 3.0.0) ) storage.mode(.Math.codes) <- "integer" if(FALSE) .Math.gen[!(.Math.gen %in% names(.Math.codes))] ## "abs" -- only one left ## A few ones have a very simple method: ## Note that the 'sign' slot is from the C-internal struct ## and is always +/- 1 , but R's sign(0) |--> 0 .getSign <- function(x) vapply(getD(x), slot, 1L, "sign") .mpfr_sign <- function(x) { r <- numeric(length(x))# all 0 not0 <- !mpfrIs0(x) r[not0] <- .getSign(x[not0]) r } setMethod("sign", "mpfr", .mpfr_sign) ## R version, no longer used: .abs.mpfr <- function(x) { ## FIXME: faster if this happened in a .Call xD <- getDataPart(x) # << currently [2011] *faster* than x@Data for(i in seq_along(x)) slot(xD[[i]], "sign", check=FALSE) <- 1L setDataPart(x, xD, check=FALSE) ## faster than x@.Data <- xD } setMethod("abs", "mpfr", function(x) .Call(Rmpfr_abs, x)) ## Simple methods for "complex" numbers, just so "they work" setMethod("Re", "mpfr", function(z) z) setMethod("Im", "mpfr", function(z) 0*z) setMethod("Conj","mpfr", function(z) z) setMethod("Mod", "mpfr", function(z) abs(z)) setMethod("Arg", "mpfr", function(z) { prec <- .getPrec(z) r <- mpfr(0, prec) neg <- !mpfrIs0(z) & .getSign(z) == -1 r[neg] <- Const("pi", prec = prec[neg]) r }) ## Note that factorial() and lfactorial() automagically work through [l]gamma() ## but for the sake of "exact for integer" setMethod("factorial", "mpfr", function(x) { r <- gamma(x + 1) isi <- .mpfr.is.whole(x) r[isi] <- round(r[isi]) r }) ## The "real" thing is to use the MPFR-internal function: factorialMpfr <- function(n, precBits = max(2, ceiling(lgamma(n+1)/log(2))), rnd.mode = c('N','D','U','Z','A')) { if(!length(n)) return(as(n, "mpfr")) stopifnot(n >= 0) new("mpfr", .Call(R_mpfr_fac, n, precBits, match.arg(rnd.mode))) } ##' Pochhammer rising factorial = Pochhammer(a,n) {1 of 2 definitions!} ##' we use the *rising* factorial for Pochhamer(a,n), i.e., ##' the definition that the GSL and Mathematica use as well. ##' We want to do this well for *integer* n, only the general case is using ##' P(a,x) := Gamma(a+x)/Gamma(x) pochMpfr <- function(a, n, rnd.mode = c('N','D','U','Z','A')) { if(!length(n)) return(a[FALSE]) stopifnot(is.integer(n <- as.integer(n)), n >= 0) if(!is(a, "mpfr")) ## use a high enough default precision (and recycle ..) a <- mpfr(a, precBits = pmax(1,n)*getPrec(a)) else if((ln <- length(n)) != 1 && ln != length(a)) a <- a + 0*n ## a@.Data[] <- .Call(R_mpfr_poch, a, n) ## a setDataPart(a, .Call(R_mpfr_poch, a, n, match.arg(rnd.mode))) } ##' Binomial Coefficient choose(a,n) ##' We want to do this well for *integer* n chooseMpfr <- function(a, n, rnd.mode = c('N','D','U','Z','A')) { if(!length(n)) return(a[FALSE]) stopifnot(is.integer(n <- as.integer(n)), n >= 0) if(!is(a, "mpfr")) { ## use high enough default precision lc <- lchoose(a,n) precB <- if(any(iF <- is.finite(lc))) ceiling(max(lc[iF])/log(2)) else 0 ## add n bits for the n multiplications (and recycle {a,n} to same length) a <- mpfr(a, precBits = n + max(2, precB)) } else if((ln <- length(n)) != 1 && ln != length(a)) a <- a + 0*n setDataPart(a, .Call(R_mpfr_choose, a, n, match.arg(rnd.mode))) } ## ------------- => ../src/utils.c chooseMpfr.all <- function(n, precBits=NULL, k0=1, alternating=FALSE) { ## return chooseMpfr(n, k0:n) or (-1)^k * choose... "but smartly" if(length(n) != 1 || !is.numeric(n) || is.na(n) || (n <- as.integer(n)) < 1) stop("n must be integer >= 1") stopifnot(is.numeric(n. <- k0), n. == (k0 <- as.integer(k0)), k0 <= n) sig <- if(alternating) (-1)^(k0:n) else rep.int(1, (n-k0+1)) if(n == 1) return(mpfr(sig, 32)) ## else : n >= 2 n2 <- n %/% 2 # >= 1 prec <- ceiling(lchoose(n,n2)/log(2)) # number of bits needed in result precBxtr <- max(2, n2 + prec) # need more for cumprod(), and division n2. <- mpfr(n2, precBxtr) r <- cumprod(seqMpfr(mpfr(n, precBxtr), n+1-n2., length.out=n2)) / cumprod(seqMpfr(1, n2., length.out=n2)) prec <- max(2,prec) if(is.numeric(precBits) && (pB <- as.integer(round(precBits))) > prec) prec <- pB r <- roundMpfr(r, precBits = prec) ## ii <- c(seq_len(n2-1+(n%%2)), n2:1) if(k0 >= 2) ii <- ii[-seq_len(k0 - 1)] one <- .d2mpfr1(1, precBits=prec) r <- c(if(k0 == 0) one, getD(r)[ii], one) if(alternating) { for(i in seq_along(r)) if(sig[i] == -1) slot(r[[i]], "sign", check=FALSE) <- - 1L } new("mpfr", r) }## {chooseMpfr.all} ## https://en.wikipedia.org/wiki/N%C3%B6rlund%E2%80%93Rice_integral ## also deals with these alternating binomial sums ##' ##' version 1: already using the 'alternating' arg in chooseMpfr.all() sumBinomMpfr.v1 <- function(n, f, n0=0, alternating=TRUE, precBits = 256) { ## Note: n0 = 0, or 1 is typical, and hence chooseMpfr.all() makes sense stopifnot(0 <= n0, n0 <= n, is.function(f)) sum(chooseMpfr.all(n, k0=n0, alternating=alternating) * f(mpfr(n0:n, precBits=precBits))) } ##' version 2: chooseZ()*(-1)^(.) is considerably faster than chooseMpfr.all() sumBinomMpfr.v2 <- function(n, f, n0=0, alternating=TRUE, precBits = 256, f.k = f(mpfr(k, precBits=precBits))) { ## Note: n0 = 0, or 1 is typical.. stopifnot(0 <= n0, n0 <= n, is.function(f) || (is(f.k, "mpfr") && length(f.k) == n-n0+1)) k <- n0:n sum(if(alternating) chooseZ(n, k) * (-1)^(n-k) * f.k else chooseZ(n, k) * f.k) } ## NB: pbetaI() in ./special-fun.R uses a special version.. ## --- if we do this *fast* in C -- do pbetaI() as well. sumBinomMpfr <- sumBinomMpfr.v2 ##' Rounding to binary bits, not decimal digits. Closer to the number ##' representation, this also allows to increase or decrease a number's precBits ##' @title Rounding to binary bits, "mpfr-internally" ##' @param x an mpfr number (vector) ##' @param precBits integer specifying the desired precision in bits. ##' @return an mpfr number as \code{x} but with the new 'precBits' precision ##' @author Martin Maechler roundMpfr <- function(x, precBits, rnd.mode = c('N','D','U','Z','A')) { stopifnot(is(x, "mpfr")) setDataPart(x, .Call(R_mpfr_round, x, precBits, match.arg(rnd.mode))) } ## "log" is still special with its 'base' : setMethod("log", signature(x = "mpfr"), function(x, base) { if(!missing(base) && base != exp(1)) stop("base != exp(1) is not yet implemented") setDataPart(x, .Call(Math_mpfr, x, .Math.codes[["log"]])) }) setMethod("Math", signature(x = "mpfr"), function(x) setDataPart(x, .Call(Math_mpfr, x, .Math.codes[[.Generic]]))) setMethod("Math2", signature(x = "mpfr"), function(x, digits) { ## NOTA BENE: vectorized in 'x' if(any(ret.x <- !is.finite(x) | mpfrIs0(x))) { if(any(ok <- !ret.x)) x[ok] <- callGeneric(x[ok], digits=digits) return(x) } if(!missing(digits)) { digits <- as.integer(round(digits)) if(is.na(digits)) return(x + digits) } ## else: default *depends* on the generic ## now: both x and digits are finite pow10 <- function(d) mpfr(rep.int(10., length(d)), precBits = ceiling(log2(10)*as.numeric(d)))^ d rint <- function(x) { ## have x >= 0 here sml.x <- (x < .Machine$integer.max) r <- x if(any(sml.x)) { x.5 <- x[sml.x] + 0.5 ix <- as.integer(x.5) ## implement "round to even" : if(any(doDec <- (abs(x.5 - ix) < 10*.Machine$double.eps & (ix %% 2)))) ix[doDec] <- ix[doDec] - 1L r[sml.x] <- ix } if(!all(sml.x)) { ## large x - no longer care for round to even r[!sml.x] <- floor(x[!sml.x] + 0.5) } r } neg.x <- x < 0 x[neg.x] <- - x[neg.x] sgn <- ifelse(neg.x, -1, +1) switch(.Generic, "round" = { ## following ~/R/D/r-devel/R/src/nmath/fround.c : if(missing(digits) || digits == 0) sgn * rint(x) else if(digits > 0) { p10 <- pow10(digits) intx <- floor(x) sgn * (intx + rint((x-intx) * p10) / p10) } else { ## digits < 0 p10 <- pow10(-digits) sgn * rint(x/p10) * p10 } }, "signif" = { ## following ~/R/D/r-devel/R/src/nmath/fprec.c : if(missing(digits)) digits <- 6L if(digits > max(.getPrec(x)) * log10(2)) return(x) if(digits < 1) digits <- 1L l10 <- log10(x) e10 <- digits - 1L - floor(l10) r <- x pos.e <- (e10 > 0) ##* 10 ^ e, with e >= 1 : exactly representable if(any(pos.e)) { p10 <- pow10(e10[pos.e]) r[pos.e] <- sgn[pos.e]* rint(x[pos.e]*p10) / p10 } if(any(neg.e <- !pos.e)) { p10 <- pow10(-e10[neg.e]) r[neg.e] <- sgn[neg.e]* rint(x[neg.e]/p10) * p10 } r }, stop(gettextf("Non-Math2 group generic '%s' -- should not happen", .Generic))) }) ##---- mpfrArray / mpfrMatrix --- methods ----------------- ## not many needed: "mpfrArray" contain "mpfr", ## i.e., if the above methods are written "general enough", they apply directly setMethod("sign", "mpfrArray", function(x) structure(.mpfr_sign(x), dim = dim(x), dimnames = dimnames(x))) Rmpfr/R/as.R0000644000175000017500000003352514107223103012422 0ustar nileshnilesh#### All coercion methods for the "Rmpfr" classes if(getRversion() < "3.5") { isFALSE <- function (x) is.logical(x) && length(x) == 1L && !is.na(x) && !x isTRUE <- function (x) is.logical(x) && length(x) == 1L && !is.na(x) && x if(getRversion() < "3.3") strrep <- function (x, times) { ## (x, times) must be "recycled" if((lx <- length(x)) < (lt <- length(times))) x <- rep_len(x, lt) else if(lt < lx) times <- rep_len(times, lx) vapply(seq_along(x), function(i) paste(rep.int(x[i], times[i]), collapse = ""), "") } if(getRversion() < "3.2") lengths <- function(x, use.names = TRUE) vapply(x, length, 1L, USE.NAMES = use.names) } ##' fast pre-test (for numeric, bigz, bigq, ..): is.mpfr <- function(x) isS4(x) && is(x, "mpfr") mpfr <- function(x, precBits, ...) UseMethod("mpfr") mpfr.mpfr <- function(x, precBits, rnd.mode = c('N','D','U','Z','A'), ...) roundMpfr(x, precBits=precBits, rnd.mode=rnd.mode) mpfr.bigz <- function(x, precBits, ...) { if(missing(precBits)) precBits <- max(2L, frexpZ(x)$exp) if(getOption("verbose")) warning("mpfr() --> .bigz2mpfr() [not efficiently via character]") ..bigz2mpfr(x, precBits) } mpfr.bigq <- function(x, precBits, ...) { if(missing(precBits)) precBits <- getPrec(x)#-> warning if(getOption("verbose")) warning("mpfr() --> .bigq2mpfr() [not efficiently via character]") ..bigq2mpfr(x, precBits) } mpfr.NULL <- function(x, ...) mpfr(logical(), ...) mpfr.default <- function(x, precBits, base = 10, rnd.mode = c('N','D','U','Z','A'), scientific = NA, ...) { if(is.ch <- is.character(x)) stopifnot(length(base) == 1, 2 <= base, base <= 62) stopifnot(is.character(rnd.mode <- toupper(rnd.mode))) rnd.mode <- match.arg(rnd.mode) if(is.raw(x)) { # is.raw() is faster stopifnot(missing(precBits) || precBits >= 2) ## else warning("unrecognized raw 'x'") # <- ?? {see use in ../tests/create.R } ## {but 'raw' is treated below} } else { ## typically the result of Vectorize() or similar on "mpfr" if(is.list(x) && all(lengths(lc <- lapply(x, class)) == 1L) && all(unlist(lc) == "mpfr1")) return(new("mpfr", x)) } ## else if(missing(precBits)) { precBits <- getPrec(x, base = base, doNumeric = FALSE) } ## libmpfr would exit (after good error message) for precBits == 1 stopifnot(precBits >= 2) ml <- if(is.numeric(x) || is.logical(x) || is.raw(x)) .Call(d2mpfr1_list, x, precBits, rnd.mode) else if(is.ch) .Call(str2mpfr1_list,x, precBits, base, rnd.mode) else stop("invalid 'x'. Must be numeric (logical, raw) or character") if(is.array(x)) { dim <- dim(x) ; dn <- dimnames(x) new(if(length(dim) == 2) "mpfrMatrix" else "mpfrArray", ml, Dim = dim, Dimnames = if(is.null(dn)) vector("list", length(dim)) else dn) } else new("mpfr", ml) } ## mpfr.default() .mpfr <- function(x, precBits) new("mpfr", .Call(d2mpfr1_list, x, precBits, "N")) .mpfr. <- function(x, precBits, rnd.mode) new("mpfr", .Call(d2mpfr1_list, x, precBits, rnd.mode)) ##' to be used in our own low-level R programming .d2mpfr1 <- function(x, precBits) .Call(d2mpfr1, x, precBits, "N") setAs("numeric", "mpfr1", ## use default precision of 128 bits function(from) .Call(d2mpfr1, from, 128L, "N"))# <- round to [N]earest setAs("numeric", "mpfr", function(from) .mpfr(from, 128L)) setAs("integer", "mpfr", function(from) .mpfr(from, 32L)) setAs("raw", "mpfr", function(from) .mpfr(from, 8L)) setAs("logical", "mpfr", function(from) .mpfr(from, 2L)) ## TODO? base=16 for "0x" or "0X" prefix -- but base must have length 1 .. setAs("character", "mpfr", function(from) mpfr(from)) setAs("mpfr", "numeric", function(from) .Call(mpfr2d, from, rnd.mode="N")) setAs("mpfr", "integer", function(from) .Call(mpfr2i, from, rnd.mode="N")) setMethod("as.numeric", "mpfr", function(x, rnd.mode="N") .Call(mpfr2d, x, rnd.mode)) ## "Z": round towards [Z]ero -- crucial for as.integer() : setMethod("as.integer", "mpfr", function(x, rnd.mode="Z") .Call(mpfr2i, x, rnd.mode)) ## FIXME (in gmp!!): asNumeric() should get "..." argument setMethod("asNumeric", "mpfr", function(x) .Call(mpfr2d, x, rnd.mode="N")) setMethod("asNumeric", "mpfrArray", function(x) toNum(x, rnd.mode="N")) setAs("mpfr1", "numeric", ## just for user-de-confusion : function(from) { warning("coercing \"mpfr1\" via \"mpfr\" (inefficient)") as(new("mpfr", list(from)), "numeric") }) setAs("mpfr1", "mpfr", function(from) new("mpfr", list(from))) setAs("mpfr", "mpfr1", function(from) { if(length(from) == 1) getD(from)[[1]] else stop("only \"mpfr\" objects of length 1 can be coerced to \"mpfr1\"") }) .mpfr1tolist <- function(x) sapply(.slotNames(x), slot, object=x, simplify=FALSE) .mpfr2list <- function(x, names=FALSE) { if(isTRUE(names)) names <- format(x) x <- lapply(getD(x), .mpfr1tolist) if(is.character(names)) names(x) <- names x } ## Breaks the working of vapply(q, FUN.x) in pbetaI() in ./special-fun.R : ## as.list.mpfr1 <- function(x, ...) .mpfr1tolist(x) ## as.list.mpfr <- function(x, ...) .mpfr2list(x) ## and then mpfrXport <- function(x, names=FALSE) { if(!is.mpfr(x)) stop("argument is not a \"mpfr\" object") structure(class = "mpfrXport", list(gmp.numb.bits = .mpfr_gmp_numbbits(), ## currently unused, but in case: mpfr.version = .mpfrVersion(), Machine = .Machine[grepl("sizeof",names(.Machine))], Sys.info = Sys.info()[c("sysname", "machine")], mpfr = .mpfr2list(x, names=names))) } mpfrImport <- function(mxp) { if(!inherits(mxp, "mpfrXport")) stop("need an \"mpfrXport\" object") nbits <- .mpfr_gmp_numbbits() if(!identical(nbits, mxp$gmp.numb.bits)) stop("GMP bits not matching: 'x' has ", mxp$gmp.numb.bits, "; the loaded 'Rmpfr' package has ", nbits) m1 <- lapply(mxp$mpfr, function(o) do.call(new, c("mpfr1", o))) new("mpfr", m1) } .mpfr2str <- function(x, digits = NULL, maybe.full = !is.null(digits), base = 10L) { ## digits = NULL : use as many digits "as needed" for the precision stopifnot(is.null(digits) || (is.numeric(digits) && length(digits) == 1 && digits >= 0), is.logical(maybe.full), length(maybe.full) == 1L, !is.na(maybe.full), is.numeric(base), length(base) == 1L, base == as.integer(base), 2 <= base, base <= 62) if(!is.null(digits) && digits == 1 && base %in% 2L^(1:5)) { ## MPFR mpfr_get_str(): "N must be >= 2"; we found that N = 1 is ok unless ## for these bases where it aborts (in C). ==> prevent that: digits <- 2L message(gettextf("base = %d, digits = 1 is increased to digits = 2", base)) } .Call(mpfr2str, x, digits, maybe.full, base) # -> ../src/convert.c } ##' very low level version, not exported : ..mpfr2str <- function(x, digits = NULL, maybe.full = !is.null(digits), base = 10L) .Call(mpfr2str, x, digits, maybe.full, base) # -> ../src/convert.c ##' more efficient, just getting the (exp, finite, is0) list, 'exp' wrt base = 2 .mpfr_formatinfo <- function(x) .Call(R_mpfr_formatinfo, x) ##' getting the 'exp' (wrt base = 2) only [also for extended erange!] .mpfr2exp <- function(x) .Call(R_mpfr_2exp, x) ldexpMpfr <- function(f, E, rnd.mode = c('N','D','U','Z','A')) { stopifnot(is.character(rnd.mode <- toupper(rnd.mode))) .Call(R_mpfr_ldexp, f, E, match.arg(rnd.mode)) } frexpMpfr <- function(x, rnd.mode = c('N','D','U','Z','A')) { stopifnot(is.character(rnd.mode <- toupper(rnd.mode))) .Call(R_mpfr_frexp, x, match.arg(rnd.mode)) } formatMpfr <- function(x, digits = NULL, trim = FALSE, scientific = NA, maybe.full = !is.null(digits) && is.na(scientific), base = 10, showNeg0 = TRUE, max.digits = Inf, big.mark = "", big.interval = 3L, small.mark = "", small.interval = 5L, decimal.mark = ".", exponent.char = if(base <= 14) "e" else if(base <= 36) "E" else "|e", exponent.plus = TRUE, zero.print = NULL, drop0trailing = FALSE, ...) { ## digits = NULL : use as many digits "as needed" ff <- .mpfr2str(x, digits, maybe.full=maybe.full, base=base) # (checks its args!) ## FIXME/TODO: If have very large numbers, but not high precision, should detect it ## ========== and use maybe.full = FALSE also for the default scientific = NA ## digs.x <- ceiling(.getPrec(x) / log2(base)) stopifnot(length(scientific) == 1L) ### max.digits "doomed": scientific := number, (~= getOption("scipen")) should replace it stopifnot(is.numeric(max.digits), max.digits > 0) if(is.numeric(digits)) stopifnot(digits <= max.digits) isNum <- ff$finite ## ff$finite == is.finite(x) i0 <- ff$is.0 ## == mpfrIs0(x) ex <- ff$exp ## the *decimal* exp (wrt given 'base' !): one too large *unless* x == 0 r <- ff$str r.dig <- nchar(r) # (in both cases, digits NULL or not) ## Note that r.dig[] entries may vary, notably for digits NULL when .getPrec(x) is non-constant if(any(Lrg <- r.dig > max.digits)) { ## now "cut down", e.g. in print() when max.digits < Inf r [Lrg] <- substr(r[Lrg], 1L, max.digits) r.dig[Lrg] <- max.digits } if(any(i0)) { ## sign(x) == -1 "fails" for '-0' hasMinus <- substr(ff$str, 1L,1L) == "-" if(!showNeg0 && any(iN0 <- hasMinus & i0)) { ## get rid of "-" for "negative zero" r[iN0] <- substring(r[iN0], 2) hasMinus[iN0] <- FALSE } Ex <- ex Ex[!i0] <- ex[!i0] - 1L } else { Ex <- ex - 1L hasMinus <- sign(x) == -1 } if(!all(isNum)) ## "@Inf@", "@NaN@", ... r[!isNum] <- gsub("@", '', r[!isNum], fixed=TRUE) ##' (maybe) add decimal point after position k patch <- function(str, k) paste(substr (str, 1L, k), substring(str, k+1L), sep = decimal.mark) ## scipen := penalty for using "scientific", i.e., exponential format scipen <- if(is.na(scientific)) as.numeric(getOption("scipen")) else if(!(is.logical(scientific) || (is.numeric(scientific) && round(scientific) == scientific))) stop("'scientific' must be logical or a whole number") else if(is.logical(scientific)) { if(scientific) -32L else max(Ex) + 64 # << penalize much } else ## is.numeric(scientific) and a whole number scientific ## This very much depends on the desired format. ## if(scientific) --> all get a final "e"; otherwise, we ## adopt the following simple scheme : ### TODO: new argument jointly = (NA | TRUE | FALSE) or just (T | F) ### ---- if(jointly) use scalar ("global") hasE and have things *align* ## 'hasE' is *vector* (along 'x') : hasE <- { if(isTRUE(scientific)) TRUE ## hasE := (wF <= wE + scipen) , where (in R's format.default, which has jointly = TRUE ): ## ~~~~~~~~~~~~~~~~ ## wE = neg + (d > 0) + d + 4 + e (width for E format); d = mxns - 1, mxns = max_i{nsig_i} ## e = #{digits of exponent} -1 (= 1 or 2 in R) ## wF = mxsl + rgt + (rgt != 0); rgt := max_i{ (digits right of ".")_i } ## mxsl := max_i{sleft_i}; sleft_i = sign_i + (digits left of ".")_i else { ## scientific = (FALSE | NA | number) --- for now : if(is.na(scientific)) scientific <- scipen isNum & (Ex < -4 + scientific | Ex > r.dig) } } if(aE <- any(ii <- isNum & hasE)) { ii <- which(ii) i. <- 1L + hasMinus r[ii] <- patch(r[ii], i.[ii]) if(drop0trailing) ## drop 0's only after decimal mark (and drop it, if immediately there) r[ii] <- sub(paste0("\\", decimal.mark, "?0+$"), "", r[ii]) chE <- if(exponent.plus) sprintf("%+.0f", Ex[ii]) # "%..f": also when Ex is outside integer range! else as.character(Ex[ii]) r[ii] <- paste(r[ii], chE, sep = exponent.char) } use.prettyN <- (base <= 14 && (!aE || exponent.char == "e")) if(non.sci <- !all(hasE)) { ## "non-scientific" i.e. without final e[+-]?+ : ii <- isNum & !hasE ## iNeg <- ex <= 0 & ii ## i.e., ex in {0,-1,-2,-3} ## iPos <- ex > 0 & ii ## i.e., ex in {1,2..., digits} iNeg <- Ex < 0 & ii ## i.e., ex in {0,-1,-2,-3} iPos <- Ex >= 0 & ii ## i.e., ex in {1,2..., digits} if(any(eq <- (Ex == r.dig))) { r[eq] <- paste0(r[eq], "0") Ex[eq] <- Ex[eq] + 1L } if(any(iNeg)) { ## "0.00..." : be careful with minus sign if(any(isMin <- hasMinus[iNeg])) { rr <- r[iNeg] rr[isMin] <- substring(rr[isMin], 2) r[iNeg] <- paste0(c("","-")[1+isMin], "0.", strrep("0", -ex[iNeg]), rr) } else { r[iNeg] <- paste0("0.", strrep("0", -ex[iNeg]), r[iNeg]) } } if(any(iPos)) ## "xy.nnnn" : r[iPos] <- patch(r[iPos], (hasMinus + Ex+1L)[iPos]) } if(use.prettyN) r <- prettyNum(r, big.mark = big.mark, big.interval = big.interval, small.mark = small.mark, small.interval = small.interval, decimal.mark = decimal.mark, zero.print = zero.print, drop0trailing = drop0trailing, preserve.width = if (trim) "individual" else "common") else { if(non.sci && drop0trailing) ## drop 0's only *after* (and together with!) decimal mark: r <- sub(paste0(decimal.mark, "0+$"), "", r) if(!missing(big.mark) || !missing(big.interval) || !missing(small.interval) || !missing(small.mark) || !missing(big.interval) || !missing(zero.print)) warning("with base >= 15 or 'exponent.char != \"e\", cannot use prettyNum()") } if(is.null(d <- dim(x))) r else array(r, dim=d, dimnames = dimnames(x)) } setMethod("format", "mpfr", formatMpfr) formatN.mpfr <- function(x, drop0trailing = TRUE, ...) { paste0(formatMpfr(x, drop0trailing=drop0trailing, ...),"_M") } setAs("mpfr", "character", function(from) format(from, digits=NULL, drop0trailing = TRUE)) setAs("character", "mpfr", function(from) mpfr(from)) Rmpfr/R/hjk.R0000644000175000017500000001147312470611664012607 0ustar nileshnilesh#### #### h o o k e j e e v e s . R Hooke-Jeeves Minimization Algorithm #### ## From: John C Nash ## To: Martin Maechler , Hans Werner Borchers ## ## Subject: Re: Rmpfr for optimization? Minor success. ## Date: Tue, 5 Jun 2012 12:37:19 -0400 ## Changing to hjk routine was a bit easier to deal with. I found main changes ## were to wrap output with as.numeric() to allow cat() to function. ## I'll get no prizes for tidy code, but it is running an n=2 Chebyquad ## minimization, and seems to be working on an n=6. This may be a good way to ## encourage the sale of cpu power. ## Best, JN hjkMpfr <- function(par, fn, control = list(), ...) { ## Following fails when par is mpfr number JN120605 ## if (!is.numeric(par)) ## stop("Argument 'par' must be a numeric vector.", call. = FALSE) n <- length(par) if (n == 1) stop("For univariate functions use some different method.", call. = FALSE) ##-- Control list handling ---------- cntrl <- list(tol = 1.e-06, maxfeval = Inf, # set to Inf if no limit wanted maximize = FALSE, # set to TRUE for maximization target = Inf, # set to Inf for no restriction info = FALSE) # for printing interim information nmsCo <- match.arg(names(control), choices = names(cntrl), several.ok = TRUE) if (!is.null(names(control))) cntrl[nmsCo] <- control tol <- cntrl$tol; maxfeval <- cntrl$maxfeval maximize <- cntrl$maximize target <- cntrl$target info <- cntrl$info scale <- if (maximize) -1 else 1 fun <- match.fun(fn) f <- function(x) scale * fun(x, ...) ##-- Setting steps and stepsize ----- nsteps <- floor(log2(1/tol)) # number of steps steps <- 2^c(-(0:(nsteps-1))) # decreasing step size dir <- diag(1, n, n) # orthogonal directions x <- par # start point fx <- f(x) # smallest value so far fcount <- 1 # counts number of function calls if (info) cat(sprintf("step nofc %-12s | %20s\n", "fmin", "xpar")) ##-- Start the main loop ------------ ns <- 0 while (ns < nsteps && fcount < maxfeval && abs(fx) < target) { ns <- ns + 1 hjs <- .hjsearch(x, f, steps[ns], dir, fcount, maxfeval, target) x <- hjs$x fx <- hjs$fx ## found <- hjs$found fcount <- fcount + hjs$finc if (info) cat(sprintf("%4d %5d %-12.7g | %-20.15g %-20.15g%s\n", ns, fcount, as.numeric(fx/scale), as.numeric(x[1]), as.numeric(x[2]), if(n > 2)" ....")) } conv <- if (fcount > maxfeval) { warning("Function evaluation limit exceeded -- may not converge.") FALSE } else if (abs(fx) > target) { warning("Function exceeds min/max value -- may not converge.") FALSE } else TRUE fx <- fx / scale # undo scaling list(par = x, value = fx, convergence = conv, feval = fcount, niter = ns) } ## Search with a single scale ----------------------------- .hjsearch <- function(xb, f, h, dir, fcount, maxfeval, target) { xc <- x <- xb finc <- 0 hje <- .hjexplore(xb, xc, f, h, dir) x <- hje$x fx <- hje$fx found <- hje$found finc <- finc + hje$numf ## Pattern move while (found) { d <- x-xb xb <- x xc <- x+d fb <- fx hje <- .hjexplore(xb, xc, f, h, dir, fb) x <- hje$x fx <- hje$fx found <- hje$found finc <- finc + hje$numf if (!found) { # pattern move failed hje <- .hjexplore(xb, xb, f, h, dir, fb) x <- hje$x fx <- hje$fx found <- hje$found finc <- finc + hje$numf } if (fcount + finc > maxfeval || abs(fx) > target) break } list(x = x, fx = fx, found=found, finc=finc) } ## Exploratory move --------------------------------------- .hjexplore <- function(xb, xc, f, h, dir, fbold) { n <- length(xb) x <- xb if (missing(fbold)) { fb <- f(x) numf <- 1 } else { fb <- fbold numf <- 0 } fx <- fb xt <- xc found <- FALSE # do we find a better point ? dirh <- h * dir fbold <- fx for (k in sample.int(n, n)) { # resample orthogonal directions p <- xt + (d. <- dirh[, k]) fp <- f(p) numf <- numf + 1 if (fp >= fb) { p <- xt - d. fp <- f(p) numf <- numf + 1 } if (fp < fb) { found <- TRUE xt <- p fb <- fp } } if(found) { x <- xt fx <- fb } list(x = x, fx = fx, found=found, numf = numf) } Rmpfr/R/formatHex.R0000644000175000017500000002507414127021566013767 0ustar nileshnilesh## sprintf("%+13.13a", x) ## hex digits after the hex point = 13 ## precBits: double precision = 53 = 1 + 13*4 ## conversion from Hex digits to binary sequences of digits HextoBin <- c( "0"="0000", "1"="0001", "2"="0010", "3"="0011", "4"="0100", "5"="0101", "6"="0110", "7"="0111", "8"="1000", "9"="1001", "A"="1010", "B"="1011", "C"="1100", "D"="1101", "E"="1110", "F"="1111", "a"="1010", "b"="1011", "c"="1100", "d"="1101", "e"="1110", "f"="1111") if(FALSE) { ## the code isn't using either of these inverses. BintoHex <- names( HextoBin[1:16]) names(BintoHex) <- HextoBin[1:16] Bintohex <- tolower(BintoHex) } ## RMH mentioned that sprintfMpfr() is "parallel" to formatMpfr() ## and agreed that in principle everything should rather be based on formatMpfr(), hence ## sprintMfpr() should become unneeded (or be *based* on formatMpfr() and renamed as basic formatFOO() ## utility for formatHex() style format -- which differs from what the MPFR lib provides (<--> our .mpfr2str()) ##' @title sprintf("%a", *)-like formatting of mpfr numbers ##' @param x mpfr-number vector ##' @param bits integer (scalar) specifing the desired number of bits ("binary digits") ##' @param style 1-character string specifying ##' @return character vector of same length as \code{x} ##' @author Martin Maechler sprintfMpfr <- function(x, bits, style = "+", expAlign=TRUE, showNeg0 = TRUE) { stopifnot(length(style <- as.character(style)) == 1, nchar(style) == 1, style %in% c("+", " "), length(bits) == 1, bits %% 1 == 0) hexdigits <- 1L + (bits-1L) %/% 4L ## common to both branches ### TODO: For consistency, no longer use sprintf() for bits <= 52 ### ---- currently "fails", e.g., in mpfr(formatBin(mpfr(2, 60))) if(bits > 52) { # <== precBits > 53 neg <- sign(x) == -1 ff <- .mpfr2str(x, hexdigits + 1L, maybe.full=FALSE, ## ???? base = 16) ## need +1 if(!showNeg0) { negzero <- substr(ff$str, 1L, 2L) == "-0" ff$str[negzero] <- substr(ff$str[negzero], 2L, 1000000L) ## force "-0" to "0". neg is already consistent. } isNum <- ff$finite ## ff$finite == is.finite(x) i0 <- ff$is.0 ## == mpfrIs0(x) FirstDigit <- substr(ff$str, 1L, 1L) FirstDigit[neg] <- substr(ff$str[neg], 2L, 2L) BinPlace <- c("0"=0, "1"=0, "2"=1, "3"=1, "4"=2, "5"=2, "6"=2, "7"=2, "8"=3, "9"=3, "a"=3, "b"=3, "c"=3, "d"=3, "e"=3, "f"=3) bitMod4 <- 2^BinPlace[FirstDigit] x[isNum] <- x[isNum] / bitMod4[isNum] ## reduce mantissa by 2^BinPlace ff <- .mpfr2str(x, hexdigits + 1L, base = 16) ## revised input value if(!showNeg0) # force "-0" to "0" ff$str[negzero] <- substr(ff$str[negzero], 2L, 1000000L) ex <- ff$exp ## the *decimal* value of base-2 exp : one too large *unless* x == 0 r <- ff$str # the mantissa, including "-" if negative Ex <- ex - 1L if(any(i0)) Ex[i0] <- ex[i0] if(!all(isNum)) ## "@Inf@", "@NaN@", ... r[!isNum] <- gsub("@", '', r[!isNum], fixed=TRUE) if(any(i <- neg & isNum)) ## r[i] <- sub("^-", "-0x", r[i]) wrongly gives e.g. "-0x.18"; want "-0x1.8" r[i] <- paste0("-0x", substr(r[i], 2L, 2L), ".", substring(r[i], 3L), "p") if(any(i <- !neg & isNum)) r[i] <- paste0(style, "0x", substr(r[i], 1L, 1L), ".", substring(r[i], 2L), "p") ## r[isNum] <- paste0(r[isNum], c("", "+")[1+ (isNum & (Ex >= 0))], 4*Ex) Exp <- 4*Ex Exp[!i0] <- Exp[!i0] + BinPlace[FirstDigit[!i0]] ## increase exponent by BinPlace if (expAlign) { Exp.format <- c("%1.1i", "%2.2i", "%3.3i")[max(1, ceiling(log10(max(abs(Exp[isNum])))))] Exp[isNum] <- sprintf(Exp.format, Exp[isNum]) } r[isNum] <- paste0(r[isNum], ## add "+" for positive exponents: c("", "+")[1+(isNum & (Ex >= 0))][isNum], Exp[isNum]) r } else { ## bits <= 52 nX <- as.character(hexdigits) if(!showNeg0) { negzero <- substr(format(x), 1L, 2L) == "-0" x[negzero] <- 0 } result <- sprintf(paste0("%", style, nX, ".", nX, "a"), x) if(any(pInf <- is.infinite(x) & x > 0)) result[pInf] <- sub("+", " ", result[pInf], fixed=TRUE) result } } ##___ ../man/formatHex.Rd ___ ## ~~~~~~~~~~~~ formatHex <- function(x, precBits = min(getPrec(x)), style = "+", expAlign=TRUE) { if (is.numeric(x)) { precBits <- getPrec(x) x <- mpfr(x, precBits) } precB <- as.integer(precBits) structure(sprintfMpfr(x, bits=precB-1L, style=style, expAlign=expAlign), ##--------- dim = dim(x), dimnames = dimnames(x), base = 16L, precBits = precB, class = c("Ncharacter", "character")) } formatBin <- function(x, precBits = min(getPrec(x)), scientific = TRUE, left.pad = "_", right.pad = left.pad, style = "+", expAlign=TRUE) { H <- formatHex(x, precBits=precBits, style=style, expAlign=expAlign) ## bindigits is number of binary digits after the precision point bindigits <- attr(H, "precBits") - 1L ## hexdigits is the number of hex digits after the precision point hexdigits <- 1L + ((bindigits-1L) %/% 4L)# *must* be correct = #{pure digits between "." and "p"} attributes(H) <- NULL finite <- is.finite(x) H <- H[finite] S <- substr(H, 1L, 1L) # sign A <- substr(H, 4L, 4L) B <- substr(H, 6L, 6L+hexdigits-1L) ## assumes *always* an exponent "p" which is correct pow <- substr(H, 6L+hexdigits+1L, 1000000L) sB <- strsplit(B, "") rsB <- do.call(rbind, sB) hrsB <- HextoBin[rsB] dim(hrsB) <- dim(rsB) hrsBa <- apply(hrsB, 1, paste, collapse="") hrsBb <- substr(hrsBa, 1, bindigits) ## While this is a truncation, ## the mpfr conversion assures that ## only zero characters are truncated. if (!scientific) { powers <- as.integer(pow) Left <- -powers + max(powers, 2-precBits) Right <- powers - min(powers, precBits-1) D <- cbind(S, "0b", strrep(left.pad, Left), A, hrsBb, strrep(right.pad, Right)) D2 <- apply(D, 1, function(x) do.call(paste, list(x, collapse=""))) ilft <- as.integer(max(Left) + min(powers)) + 4L res <- paste0(substr(D2, 1L, ilft ), ".", substr(D2, ilft+1L, 1000000L)) } else { res <- cbind(S, "0b", A, ".", hrsBb, "p", pow) res <- apply(res, 1, function(x) do.call(paste, list(x, collapse=""))) } result <- rep("", length(x)) result[finite] <- res result[!finite] <- as.numeric(x[!finite]) structure(result, dim = dim(x), dimnames = dimnames(x), base = 2L, precBits = precBits, class = c("Ncharacter", "character")) } print.Ncharacter <- function(x, ...) { y <- unclass(x) attr(y,"base") <- NULL attr(y,"precBits") <- NULL myR <- attr(x,"base") != 10L ## formatDec() currently left-aligns [yes, this is a hack] ## print(y, quote=FALSE, right = myR, ...) # protecting against multiple 'quote' and 'right' ## ensuring 'quote=*' and 'right=*' in '...' take precedence : pa <- c(list(...), list(quote=FALSE, right = myR)) do.call(print, c(list(y), pa[unique(names(pa))])) invisible(x) } ## RMH 2017-05-23, ~/R/MM/Pkg-ex/Rmpfr/formatDec-revised2.R : formatDec <- function(x, precBits = min(getPrec(x)), digits=decdigits, nsmall=NULL, scientific=FALSE, style="+", decimalPointAlign = TRUE, ...) { if (is.character(x)) x <- as.numeric(x) if (is.numeric(x)) x <- mpfr(x, precBits) else if (is.complex(x)) stop("complex 'x' are not supported in \"Rmpfr\" (yet)") decdigits <- ceiling(log(2^precBits, 10)) + 1 chx <- format(x, digits=max(digits, decdigits), nsmall=nsmall, scientific=scientific, style=style, ...) if (decimalPointAlign) { fin.x <- is.finite(x) chx[fin.x] <- formatAlign(chx[fin.x], ...) } structure(chx, dim = dim(x), dimnames = dimnames(x), base = 10L, precBits = precBits, class = c("Ncharacter", "character")) } ##' Non exported utility currently only used in formatDec(); ##' NB: '...' here, so we can pass '...' above which may have arguments not for here formatAlign <- function(x, leftpad=" ", rightpad=leftpad, ...) { if(!length(x)) return(x) lr <- strsplit(x, ".", fixed=TRUE) l <- sapply(lr, `[`, 1) ## l left r <- sapply(lr, `[`, 2) ## r right r[is.na(r)] <- "" nl <- nchar(l) nr <- nchar(r) ## substring() vectorizes (with 'nl'): l.blank <- substring(strrep(leftpad, max(nl)), 1L, max(nl) - nl) r.blank <- substring(strrep(rightpad,max(nr)), 1L, max(nr) - nr) paste0(l.blank, l, ".", r, r.blank) } ##' currently still used in mpfr.Ncharacter(), but _not_ as a method mpfr.Bcharacter <- function(x, precBits, scientific = NA, ...) { ## was scanBin() stopifnot(is.numeric(precBits)) if (is.na(scientific)) ## we look for a "p" exponent.. scientific <- any(grepl("p", x, fixed=TRUE)) class(x) <- NULL if (!scientific) { x <- gsub("_", "0", x) ## TODO: chartr(.......) } mpfr(x, base = 2, precBits=precBits, ...) } ## A mpfr() method for "Ncharacter" mpfr.Ncharacter <- function(x, precBits = attr(x, "precBits"), ...) { class(x) <- NULL B <- attr(x, "base") if(B == 2) ## formatBin() gives very special format : mpfr.Bcharacter(x, precBits = precBits, ...) else mpfr(x, base = B, precBits = precBits, ...) } ## was ## mpfr.Dcharacter <- function(x, precBits=attr(x, "bindigits")+1, ...) { ## class(x) <- NULL ## mpfr(gsub(" ", "", x), base = 10, precBits=precBits, ...) ## } `[.Ncharacter` <- ## == base :: `[.listof` function (x, ...) structure(NextMethod("["), class = class(x)) ## more sophisticated; should work for matrix subsetting as with base .. `[.Ncharacter` <- function (x, ...) { ax <- attributes(x) ## and *drop* some ax <- ax[setdiff(names(ax), c("dim", "dimnames", "names"))] if(length(ax)) { r <- NextMethod("[") # may have dim, dimnames | names `attributes<-`(r, c(attributes(r), ax)) } else NextMethod("[") } ## Don't seem to get these to work correctly (at least not easily): ## cbind.Bcharacter <- cbind.Hcharacter <- ## function (...) structure(NextMethod("cbind"), class = class(..1)) ## rbind.Bcharacter <- rbind.Hcharacter <- ## function (...) structure(NextMethod("rbind"), class = class(..1)) ## NB: It *could* make sense to set default stringsAsFactors = FALSE here.. ## but it would *not* be used when called from data.frame() which has its own default as.data.frame.Ncharacter <- function (x, ...) { ## class(x) <- class(x)[class(x) != "Ncharacter"] ## as.data.frame(x, ...) NextMethod("as.data.frame") } Rmpfr/R/Arith.R0000644000175000017500000002600613752265550013103 0ustar nileshnilesh#### Define mpfr methods for Arith + Compare + Logic group functions #### ====== ======= ===== ### "Math" are done in ./Math.R , "Summary" in ./Summary.R ### ---- ~~~~~~ ------- ~~~~~~~~~ ### NB: Look at /usr/local/app/R/R_local/src/Brobdingnag/R/brob.R ### ----------- ##' return 'x' unless it is NULL where you'd use 'orElse' `%||%` <- function(x, orElse) if(!is.null(x)) x else orElse if(FALSE) { print(getGroupMembers("Ops"))# "Arith" "Compare" "Logic" .Ops.list <- sapply(getGroupMembers("Ops"), getGroupMembers, simplify=FALSE) str(.Ops.list, vec.len = 20) ## $ Arith : chr [1:7] "+" "-" "*" "^" "%%" "%/%" "/" ## $ Compare: chr [1:6] "==" ">" "<" "!=" "<=" ">=" ## $ Logic : chr [1:2] "&" "|" } ## Using "vector" and "array" seperately, rather than "ANY" ## ===> shorter distance in method dispatch calculation : setMethod("Ops", signature(e1 = "mpfr", e2 = "vector"), function(e1, e2) callGeneric(e1, as(e2, "numeric"))) setMethod("Ops", signature(e1 = "vector", e2 = "mpfr"), function(e1, e2) callGeneric(as(e1, "numeric"), e2)) ## These should not trigger anymore (because we have "Arith"/"Compare"/...): setMethod("Ops", signature(e1 = "mpfr", e2 = "array"), function(e1, e2) stop(gettextf("'%s'(mpfr,array) method is not implemented yet", .Generic))) setMethod("Ops", signature(e1 = "array", e2 = "mpfr"), function(e1, e2) stop(gettextf("'%s'(array,mpfr) method is not implemented yet", .Generic))) setMethod("Ops", signature(e1 = "mpfr", e2 = "bigz"), function(e1, e2) callGeneric(e1, .bigz2mpfr(e2))) setMethod("Ops", signature(e1 = "bigz", e2 = "mpfr"), function(e1, e2) callGeneric(.bigz2mpfr(e1), e2)) # ..bigq2mpfr(q, NULL) determines the necessary precision for q : setMethod("Ops", signature(e1 = "mpfr", e2 = "bigq"), function(e1, e2) callGeneric(e1, ..bigq2mpfr(e2, NULL))) setMethod("Ops", signature(e1 = "bigq", e2 = "mpfr"), function(e1, e2) callGeneric(..bigq2mpfr(e1, NULL), e2)) setMethod("Logic", signature(e1 = "mpfr", e2 = "mpfr"), function(e1, e2) callGeneric(as(e1, "numeric"), as(e2, "numeric"))) setMethod("Logic", signature(e1 = "mpfr", e2 = "numeric"), function(e1, e2) callGeneric(as(e1, "numeric"), e2)) setMethod("Logic", signature(e1 = "numeric", e2 = "mpfr"), function(e1, e2) callGeneric(e1, as(e2, "numeric"))) ## FIXME?: probably also need etc ###-- 2) ----------- Arith -------------------------------------------------- ## R version, no longer used: .mpfr_negativeR <- function(x) { xD <- getDataPart(x)# << currently [2011] *faster* than x@Data for(i in seq_along(x)) slot(xD[[i]], "sign", check=FALSE) <- - xD[[i]]@sign setDataPart(x, xD, check=FALSE) ## faster than x@Data <- xD } .mpfr_negative <- function(x) .Call(Rmpfr_minus, x) setMethod("Arith", signature(e1 = "mpfr", e2="missing"), function(e1,e2) { switch(.Generic, "+" = e1, "-" = .mpfr_negative(e1), stop(paste("Unary operator", .Generic, "not defined for \"mpfr\" numbers")) ) } ) .Arith.codes <- c("+" = 1, "-" = 2, "*" = 3, "^" = 4, "%%" = 5, "%/%" =6, "/" = 7) storage.mode(.Arith.codes) <- "integer" setMethod("Arith", signature(e1 = "mpfr", e2 = "mpfr"), function(e1, e2) { new("mpfr", .Call(Arith_mpfr, e1, e2, .Arith.codes[.Generic])) }) setMethod("Arith", signature(e1 = "mpfr", e2 = "integer"), function(e1, e2) { new("mpfr", .Call(Arith_mpfr_i, e1, e2, .Arith.codes[.Generic])) }) setMethod("Arith", signature(e1 = "integer", e2 = "mpfr"), function(e1, e2) { new("mpfr", .Call(Arith_i_mpfr, e1, e2, .Arith.codes[.Generic])) }) setMethod("Arith", signature(e1 = "mpfr", e2 = "numeric"),# not "integer" function(e1, e2) { new("mpfr", .Call(Arith_mpfr_d, e1, e2, .Arith.codes[.Generic])) }) setMethod("Arith", signature(e1 = "numeric", e2 = "mpfr"),# not "integer function(e1, e2) { new("mpfr", .Call(Arith_d_mpfr, e1, e2, .Arith.codes[.Generic])) }) ###-- 3) ----------- Compare -------------------------------------------------- .Compare.codes <- c("==" = 1, ">" = 2, "<" = 3, "!=" = 4, "<=" = 5, ">=" =6) storage.mode(.Compare.codes) <- "integer" ## Define "Reverse" codes such that, e.g., ## .Compare.codes[ .Compare.codesRev[">="] ] |--> "<=" .Compare.codesRev <- .Compare.codes # names() in same order; indices swapped: .Compare.codesRev[] <- .Compare.codes[c(1, 3:2, 4, 6:5)] setMethod("Compare", signature(e1 = "mpfr", e2 = "mpfr"), function(e1, e2) { .Call(Compare_mpfr, e1, e2, .Compare.codes[.Generic]) }) setMethod("Compare", signature(e1 = "mpfr", e2 = "integer"), function(e1, e2) { .Call(Compare_mpfr_i, e1, e2, .Compare.codes[.Generic]) }) setMethod("Compare", signature(e1 = "mpfr", e2 = "numeric"),# not "integer" function(e1, e2) { .Call(Compare_mpfr_d, e1, e2, .Compare.codes[.Generic]) }) setMethod("Compare", signature(e1 = "integer", e2 = "mpfr"), function(e1, e2) { .Call(Compare_mpfr_i, e2, e1, .Compare.codesRev[.Generic]) }) setMethod("Compare", signature(e1 = "numeric", e2 = "mpfr"), function(e1, e2) { .Call(Compare_mpfr_d, e2, e1, .Compare.codesRev[.Generic]) }) ### -------------- mpfrArray ------------------------ .dimCheck <- function(a, b) { da <- dim(a) db <- dim(b) if(length(da) != length(db) || any(da != db)) stop(gettextf("Matrices must have same dimensions in %s", deparse(sys.call(sys.parent()))), call. = FALSE) da } setMethod("Arith", signature(e1 = "mpfrArray", e2 = "mpfrArray"), function(e1, e2) { .dimCheck(e1, e2) ## else: result has identical dimension: e1@.Data[] <- .Call(Arith_mpfr, e1, e2, .Arith.codes[.Generic]) e1 }) setMethod("Arith", signature(e1 = "mpfrArray", e2 = "mpfr"), function(e1, e2) { if(length(e1) %% length(e2) != 0) stop("length of first argument (array) is not multiple of the second argument's one") ## else: result has dimension from array: e1@.Data[] <- .Call(Arith_mpfr, e1, e2, .Arith.codes[.Generic]) e1 }) ## "macro-like encapsulation" -- using .Call(, *) for checks .Arith.num.mpfr <- function(x,y, FUN) { if(is.integer(x)) .Call(Arith_i_mpfr, x,y, .Arith.codes[FUN]) else .Call(Arith_d_mpfr, x,y, .Arith.codes[FUN]) } .Arith.mpfr.num <- function(x,y, FUN) { if(is.integer(y)) .Call(Arith_mpfr_i, x,y, .Arith.codes[FUN]) else .Call(Arith_mpfr_d, x,y, .Arith.codes[FUN]) } .Compare.num.mpfr <- function(x,y, FUN) { if(is.integer(x)) .Call(Compare_mpfr_i, y,x, .Compare.codesRev[FUN]) else .Call(Compare_mpfr_d, y,x, .Compare.codesRev[FUN]) } .Compare.mpfr.num <- function(x,y, FUN) { if(is.integer(y)) .Call(Compare_mpfr_i, x,y, .Compare.codes[FUN]) else .Call(Compare_mpfr_d, x,y, .Compare.codes[FUN]) } setMethod("Arith", signature(e1 = "array", e2 = "mpfr"),# incl "mpfrArray" function(e1, e2) { if(e2Arr <- !is.null(dim(e2))) .dimCheck(e1, e2) else if(length(e1) %% length(e2) != 0) stop("length of first argument (array) is not multiple of the second argument's one") if(e2Arr) { e2@.Data[] <- .Arith.num.mpfr(e1, e2, .Generic) e2 } else { r <- new("mpfrArray") r@Dim <- dim(e1) if(!is.null(dn <- dimnames(e1))) r@Dimnames <- dn r@.Data <- .Arith.num.mpfr(e1, e2, .Generic) r } }) setMethod("Arith", signature(e1 = "mpfr", e2 = "array"),# "mpfr" incl "mpfrArray" function(e1, e2) { if(e1Arr <- !is.null(dim(e1))) .dimCheck(e1, e2) else if(length(e2) %% length(e1) != 0) stop("length of second argument (array) is not multiple of the first argument's one") if(e1Arr) { e1@.Data[] <- .Arith.mpfr.num(e1, e2, .Generic) e1 } else { r <- new("mpfrArray") r@Dim <- dim(e2) if(!is.null(dn <- dimnames(e2))) r@Dimnames <- dn r@.Data <- .Arith.mpfr.num(e1, e2, .Generic) r } }) setMethod("Arith", signature(e1 = "mpfrArray", e2 = "numeric"), function(e1, e2) { if(length(e1) %% length(e2) != 0) stop("length of first argument (array) is not multiple of the second argument's one") e1@.Data[] <- .Arith.mpfr.num(e1, e2, .Generic) e1 }) setMethod("Arith", signature(e1 = "numeric", e2 = "mpfrArray"), function(e1, e2) { if(length(e2) %% length(e1) != 0) stop("length of second argument (array) is not multiple of the first argument's one") e2@.Data[] <- .Arith.num.mpfr(e1, e2, .Generic) e2 }) setMethod("Arith", signature(e1 = "mpfr", e2 = "mpfrArray"), function(e1, e2) { if(length(e2) %% length(e1) != 0) stop("length of second argument (array) is not multiple of the first argument's one") e2@.Data[] <- .Call(Arith_mpfr, e1, e2, .Arith.codes[.Generic]) e2 }) setMethod("Compare", signature(e1 = "mpfrArray", e2 = "mpfr"), function(e1, e2) { if(is.null(dim(e2))) { if(length(e1) %% length(e2) != 0) stop("length of first argument (array) is not multiple of the second argument's one") } else .dimCheck(e1, e2) structure(.Call(Compare_mpfr, e1, e2, .Compare.codes[.Generic]), dim = dim(e1), dimnames = dimnames(e1)) }) setMethod("Compare", signature(e1 = "mpfr", e2 = "mpfrArray"), function(e1, e2) { if(is.null(dim(e1))) { if(length(e2) %% length(e1) != 0) stop("length of second argument (array) is not multiple of the first argument's one") } else .dimCheck(e1, e2) structure(.Call(Compare_mpfr, e1, e2, .Compare.codes[.Generic]), dim = dim(e2), dimnames = dimnames(e2)) }) setMethod("Compare", signature(e1 = "mpfr", e2 = "array"),# "mpfr" incl "mpfrArray" function(e1, e2) { if(is.null(dim(e1))) { if(length(e2) %% length(e1) != 0) stop("length of second argument (array) is not multiple of the first argument's one") } else .dimCheck(e1, e2) structure(.Compare.mpfr.num(e1, e2, .Generic), dim = dim(e2), dimnames = dimnames(e2)) }) setMethod("Compare", signature(e1 = "array", e2 = "mpfr"),# incl "mpfrArray" function(e1, e2) { if(is.null(dim(e2))) { if(length(e1) %% length(e2) != 0) stop("length of first argument (array) is not multiple of the second argument's one") } else .dimCheck(e1, e2) structure(.Compare.num.mpfr(e1, e2, .Generic), dim = dim(e1), dimnames = dimnames(e1)) }) setMethod("Compare", signature(e1 = "mpfrArray", e2 = "numeric"),# incl integer function(e1, e2) { if(length(e1) %% length(e2) != 0) stop("length of first argument (array) is not multiple of the second argument's one") structure(.Compare.mpfr.num(e1, e2, .Generic), dim = dim(e1), dimnames = dimnames(e1)) }) setMethod("Compare", signature(e1 = "numeric", e2 = "mpfrArray"), function(e1, e2) { if(length(e2) %% length(e1) != 0) stop("length of second argument (array) is not multiple of the first argument's one") structure(.Compare.num.mpfr(e1, e2, .Generic), dim = dim(e2), dimnames = dimnames(e2)) }) Rmpfr/inst/0000755000175000017500000000000014136173460012454 5ustar nileshnileshRmpfr/inst/NEWS.Rd0000644000175000017500000004421714136173450013526 0ustar nileshnilesh% Check from R: % news(db = tools:::.build_news_db_from_package_NEWS_Rd("~/R/Pkgs/Rmpfr/inst/NEWS.Rd")) \name{NEWS} \title{Rmpfr News} \encoding{UTF-8} \section{Changes in version 0.8-7 [2021-10-27, r353}{ \subsection{BUG FIXES}{ \itemize{ \item In \file{Ops.c}'s \code{R_mpfr_mod()}, no longer allocate but never use nor free \code{rr} - fixing YAL (yet another leak). } } } \section{Changes in version 0.8-6 [2021-10-08, r351}{ \subsection{BUG FIXES}{ \itemize{ \item In \file{convert.c}'s \code{R_mpfr_frexp()}, do \code{mpfr_clear(*)}, fixing a valgrind-detectable leak. \item additionally use single mpfr_exp_t and its pointer (and assign to R allocated vector inside main loop, fixing a valgrind "unitialized value" case. } } } \section{Changes in version 0.8-5 [2021-10-05, r349]}{ \subsection{NEW FEATURES}{ \itemize{ \item New mpfr-ized \code{dt(x, df, ..)}; noncentrality \code{ncp} not yet supported. \item New arithmetic functions \code{frexpMpfr()} and \code{ldexpMpfr()}, corresponding to C's (and CRAN package \CRANpkg{DPQ}'s) \code{ldexp()} and \code{frexp()} functions. \item \code{sapplyMpfr()} now also returns \code{"mpfrMatrix"} or \code{"mpfrArray"} when appropriate. } } \subsection{BUG FIXES}{ \itemize{ \item Improved \code{`[.Ncharacter`} method for \code{formatHex()} etc. } } \subsection{Misc}{ \itemize{ \item No longer include \file{Rdefines.h} as it is somewhat deprecated. \item update \file{configure{.ac}} (for \command{autoconf 2.71}). } } } \section{Changes in version 0.8-4 [2021-03-24, r341]}{ \subsection{NEW FEATURES}{ \itemize{ \item \code{dpois(x, *)} now also gets an explicit optional argument \code{useLog} instead of just switching to log-scale by the same test as defines \code{useLog}'s default. \item The default method of \code{mpfr(r)} now also works when \code{r} is a \code{list} of \code{"mpfr1"} objects, e.g., resulting from \code{Vectorize(.)} or similar applied to mpfr-vectors. } } \subsection{BUG FIXES}{ \itemize{ \item fixed problem detected by clang-UBSAN testing in \file{src/Ops.c} (from arithmetic bug fix in 0.8-3). % ../tests/arith-ex.Rout_clang-UBSAN } } } \section{Changes in version 0.8-3 [2021-03-22, r340]}{ \subsection{NEW FEATURES}{ \itemize{ \item \code{dnbinom(x, *)} and \code{dbinom(x, *)} now also work when \code{x} is too large to be coerced to \code{integer} \emph{and} they get a new optional argument \code{useLog} (with a smart default) in order to choose log-scale computation also for \code{log=FALSE}. } } \subsection{BUG FIXES}{ \itemize{ \item For arithmetic (\code{`+`}, \code{`*`}, etc), the check to see if a numeric can be validly coerced to a long has been amended such that 9223372036854775808 is no longer accidentally coerced into \emph{negative}. \item \code{dpois(x, lambda)} now works via log-scale in case \code{exp(-lambda)} or \code{lambda^x} would under- or overflow even for mpfr-numnbers. Analogously, \code{dbinom()} and \code{dnbinom()} work via log-scale in case even mpfr-arithmetic would overflow. } } } \section{Changes in version 0.8-2 [2020-11-10, r337]}{ \subsection{NEW FEATURES}{ \itemize{ \item The workhorse for all matrix multiplication (\code{\%*\%}, \code{crossprod()}, and \code{tcrossprod()}), i.e., \code{.matmult.R(x, y, *)} (not exported), gets new optional arguments \code{fPrec = 1} and \code{precBits}, which defaults to the maximum of \code{getPrec(x)} and \code{getPrec(y)}. To get correct \code{crossprod()} and tcrossprod() generics (with a formal \code{\dots} argument), need a new \CRANpkg{gmp} release, as we get these two generics from \pkg{gmp}. \item \code{matmult(x,y)} is identical to \code{x \%*\% y}, but \code{matmult()} has further optional arguments \code{fPrec} and \code{precBits}, see above. \item New \code{is.mpfr(x)} function; simple, with fast pre-test. \item In \code{pbetaI(q, ..)}, when \code{q} is a bigrational, i.e., of class \code{"bigq"} (package \CRANpkg{gmp}), the computations are \emph{exact} now, using big rational arithmetic. \item New \code{dnbinom()} function (with corresponding new \code{\link{conflicts}()} with the \pkg{stats} package base \R function), providing an \code{"mpfr"}-number version of the negative binomial probabilities. \item \code{.mpfr_erange_set()} now can set \emph{both} exponent range limits simultaneously, and now returns invisibly \code{TRUE} if the change succeeded. \item New \code{log1mexp()} and \code{log1pexp()}, as "from" \CRANpkg{copula}, notably as the vignette has been here, and authored by me. } } \subsection{BUG FIXES}{ \itemize{ \item \code{mpfr(mm)} (and similar) now works for \code{"bigq"} or \code{"bigz"} matrices, thanks to a report by Jerry Lewis. \item Arithmetic and other \code{"\link{Ops}"} between \code{"mpfr"} and \code{"bigq"} aka bigrational numbers, now use the \dQuote{inherent} precision of the bigrational. \item \code{chooseMpfr(a, n)} and similar now \dQuote{work} when \code{n} is of length zero \emph{and} when an experimental version of \code{stopifnot(*, allow.logical0=FALSE)} is used. \item Our \code{cbind()} and \code{rbind()} methods with \code{signature = "mNumber"} now keep and construct column and row names as the corresponding base functions, obeying \code{deparse.level}. \item Fixed "not-yet"-as-cran \file{NOTE} \emph{Undeclared packages \pkg{dfoptim}, \pkg{pracma} in Rd xrefs}. } } } \section{Changes in version 0.8-1 [2020-01-14, r323]}{ \subsection{BUG FIXES}{ \itemize{ \item Provide dummy C function in the case MPFR library is older than 3.2.0, thanks to Brian Ripley. Should work around check \code{NOTE}s. } } } \section{Changes in version 0.8-0 [2019-12-05, r321]}{ \subsection{USER-VISIBLE CHANGES}{ \itemize{ \item Formatting incl \code{print()}ing by default uses a \code{"+"} after the exponential character (\code{"e"} by default). } } \subsection{NEW FEATURES}{ \itemize{ \item Provide new low-level utilities \code{.mpfr_formatinfo()}, \code{.mpfr2exp()}, and \code{.mpfr_erange_is_int()}. \item Renamed low-level utility functions to use \code{_} instead of \code{.} keeping initial \code{"."}, e.g., \code{.mpfr.gmp.numbbits()} to \code{.mpfr_gmp_numbbits()}. \item \code{formatMpfr()} gets a new optional \code{decimal.plus = TRUE} which adds a \code{"+"} before positive exponents when in exponential (aka \dQuote{scientific}) representation. The \code{mpfr} and \code{mpfrArray} \code{print()} methods get a corresponding \code{decimal.plus} argument with a default that can be set by \code{options(Rmpfr.print.decimal.plus = *)} to allow strict back compatibility where needed. \item For MPFR (C library) version >= 3.2.0 (not by default in Fedora 30!), provide the \emph{incomplete} gamma function \code{igamma(a,x)} which is closely related to \code{pgamma(x,a)}, see help page.% and DO % provide an MPFR pgamma() version, too % ==> then even MPFR pchisq() with *non*centrality maybe! \item Now also export S3 method of \code{unique()} for \code{"mpfr"}, such that \pkg{base} \code{factor()} \dQuote{works}.% -> ../man/mpfr-class.Rd } } \subsection{BUG FIXES}{ \itemize{ \item \code{formatMpfr()} and hence all \code{print()}ing suffered from an integer overflow bug with very large (base 2) exponents. \item \code{.mpfr2str(x, *)} is no longer dependent on the \emph{order} of the elements in \code{x}; consequently \code{format()} and \code{print()} may use less digits in case the precision decreases along \code{x}. \item adapt to new C compiler default behavior \code{-fno-common}, using \code{extern #include } in most \file{*.c} files. } } } \section{Changes in version 0.7-3 [2019-08-06, r305]}{ \subsection{USER-VISIBLE CHANGES}{ \itemize{ \item Decreased the default for \code{max.digits} to 999. } } \subsection{NEW FEATURES}{ \itemize{ \item Provide \code{dgamma(x, shape)} version, e.g., for small shape parameter where most of the mass is on very small \code{x} not representable as double precision numbers. \item Low-level formatting function \code{.mpfr2str()} --- called by \code{format()} and hence \code{print()} methods for \code{"mpfr"} objects --- now finally obeys its \code{maybe.full} argument when it is \code{FALSE}, internally in C's \code{mpfr2str()}. } } \subsection{BUG FIXES}{ \itemize{ \item \code{pnorm(, log.p=TRUE)} no longer underflows much too early, thanks to reports by Jerry Lewis. \item \code{print.mpfrArray()} now also uses a finite \code{max.digits} default, preventing, e.g., \code{cbind(x, y)} to use too many digits. } } } \section{Changes in version 0.7-2 [2019-01-18, r299]}{ \subsection{BUG FIXES}{ \itemize{ \item \code{str()} no longer calls \code{formatMpfr(x, digits, *)} with a \code{digits} \emph{vector} of the same length as \code{x} (which never worked correctly). \item \code{seqMpfr(1, length.out=8)} now works correctly. } } \subsection{NEW FEATURES}{ \itemize{ \item \code{unirootR()} gets an option to \emph{not} warn on non-convergence. \item Provide a \code{summary()} method for \code{"mpfr"} numbers closely modeled after \code{summary.default} for numeric. \item \code{mpfr(NULL)} now works, returning \code{mpfr(logical())}. \item a simple \code{sapplyMpfr()} function, showing how to work around the fact that \code{sapply()} does typically not work with \code{"mpfr"} numbers. } } } \section{Changes in version 0.7-1 [2018-07-24, r291]}{ \subsection{BUG FIXES}{ \itemize{ \item \code{formatMpfr()} for large low-precision numbers now uses scientific representation, fixing the bug RMH was reporting March 17 already. \item \code{outer()} is \dQuote{imported} from base, so it behaves as an \pkg{Rmpfr} function which dispatches e.g., when calling \code{\link{tcrossprod}()}. } } } \section{Changes in version 0.7-0 [2018-01-12, r284]}{ \subsection{NEW FEATURES}{ \itemize{ \item \code{.mpfr2list()} and \code{mpfrXport()} gain an option \code{names} (for nicer output). \item \code{formatMpfr()} and the \code{print()} method get a new option \code{max.digits} with default \code{9999} for the print methods, to limit the number of digits printed for high precision numbers. } } \subsection{BUG FIXES}{ \itemize{ \item For non-\dQuote{regular} mpfr numbers, the \code{d} slot in the \code{"mpfr1"} representation is now empty instead of \dQuote{random}. This also eliminates valgrind warnings about uninitialized values in C. } } } \section{Changes in version 0.6-2 [2017-05-29, r264], never on CRAN}{ \subsection{NEW FEATURES}{ \itemize{ \item The S3 classes \code{"Hcharacter"} and \code{"Bcharacter"} resulting from \code{formatHex()} and \code{formatBin()} now \dQuote{inherit from} \code{"character"} formally. \item They also got a \code{`[`} method, so subsetting should work, including for \code{array}s of these. \item The \code{"mpfr"} method of \code{str()} gains option \code{internal}. } } \subsection{BUG FIXES}{ \itemize{ \item when \code{print()}ing mpfr numbers, the result no longer sometimes loses the last digit. \item \code{dnorm()} now works correctly with mpfr numbers; similarly \code{dbinom()} and \code{dpois()} should work in all cases, now. \item in \file{NAMESPACE}, also \code{exportMethods(apply)}, so \pkg{SNscan} works. \item \code{print(formatHex(..))}, \code{formatBin()} and \code{formatDec()} now look better and are more correct; the first two get a new option \code{expAlign} indicating to use the same number of digits for exponents (in \dQuote{scientific} cases). Notably, \code{mpfr(formatBin(mpx))} works for more \code{mpx} objects (of class \code{"mpfr"}). \item \code{format(mpfr(3,7), digits = 1, base = 2)} no longer crashes (from inside MPFR). \item \code{formatDec(mpfr(NA, 7))} now works. \item For non-\dQuote{regular} mpfr numbers, the \code{d} slot in the \code{"mpfr1"} representation is now empty instead of \dQuote{random}. This also eliminates valgrind warnings about uninitialized values in C. } } } \section{Changes in version 0.6-1 [2016-11-15, r249]}{ \subsection{NEW FEATURES}{ \itemize{ \item \code{head()} and \code{tail()} methods for \code{"mpfrMatrix"}. } } \subsection{BUG FIXES}{ \itemize{ \item C-level \code{mpfr2str()} no longer calls S_realloc() with wrong "old size" (thanks to Bill Dunlap). \item \code{c()} now also works when its result is a length-0 \code{"mpfr"} object. } } } \section{Changes in version 0.6-0 [2015-12-04, r237]}{ \subsection{NEW FEATURES}{ \itemize{ \item \code{mpfr()} now is S3 generic with several methods, notably a \code{"mpfr"} method allowing to change precision or rounding mode. \item \code{mpfr()}, \code{formatMpfr()}, etc, now work with bases from 2 to 62 (using digits, upper and lower case ASCII letters, \code{62 == 10 + 2*26} characters), as this has been in MPFR since version 3.0.0 (see \code{\link{mpfrVersion}}), which is hence (implicitly) required for \code{base} greater than 36. \item \code{formatMpfr()} gets a new argument \code{base = 10} and can be used to produce in other bases, notably binary (\code{base = 2}) or hexadecimal (\code{base = 16}). \item \code{str(, ....)} is now based on \code{formatMpfr()} and nicely shows numbers also out of the double precision range. Further, it now chooses a smart default for optional argument \code{vec.len}. \item \code{matrix(mp, ..)} now also works when \code{mp} is of class \code{"mpfr"}. \item new matrix \code{norm()} for several \code{kind}s. \item new functions \code{formatHex()} and \code{formatBin()} thanks to Rich Heiberger. \item \code{mpfr(x)} also works as \emph{inverse} of \code{formatBin} and \code{formatHex}. \item \code{roundMpfr()} and mathematical functions such as \code{jn}, or \code{chooseMpfr()} get new optional argument \code{rnd.mode} passed to the corresponding MPFR function. \item \code{median(x)}, \code{mean(x, trim)} for \code{trim > 0} now work fine for \code{"mpfr"} x, and \code{quantile(x, *)} no longer needs \code{names=FALSE} to avoid a warning. } } \subsection{BUG FIXES}{ \itemize{ \item \code{pnorm(.)}, \code{j0()} and similar special functions now preserve \code{mpfrMatrix} and \code{mpfrArray} classes. \item similarly, \code{is.finite()} etc keep the \code{dim()}ensionality for \code{"mpfrArray"} arguments. \item \code{mpfr("0xabc", base=16)} and \code{mpfr("0b101", base=2)} and corresponding \code{getPrec()} now give the correct precBits instead of too many. \item \code{str(<0-length mpfr>)} now works correctly. } } } \section{Changes in version 0.5-7 [2014-11-27, r205]}{ \subsection{NEW FEATURES}{ \itemize{ \item . } } \subsection{BUG FIXES}{ \itemize{ \item \code{as.integer()} now rounds \dQuote{to zero} as for regular \R numbers (it accidentally did round \dQuote{to nearest} previously). } } } \section{Changes in version 0.5-6 [2014-09-05, r203]}{ \subsection{NEW FEATURES}{ \itemize{ \item experimental \code{mpfrImport()}, \code{mpfrXport()} utilities -- as we found cases, where save() \code{"mpfr"} objects were \emph{not} portable between different platforms. \item \code{as(*,"mpfr")} now also supports rounding mode \code{"A"} (\dQuote{\bold{A}way from zero}). \item Several hidden low level utilities also get a \code{rnd.mode} option. } } \subsection{BUG FIXES}{ \itemize{ \item . } } } \section{Changes in version 0.5-5 [2014-06-19, r190]}{ \subsection{NEW FEATURES}{ \itemize{ \item The result of \code{integrateR()} now prints even if a warning happened. \item \code{pbetaI(x, a,b)}, the arbitrarily accurate \code{pbeta()} computation for \emph{integer} \eqn{a} and \eqn{b}, now works for larger \eqn{(a,b)}. \item Newly providing \code{mpfr}-versions of \code{dbinom()}, \code{dpois()}, and \code{dnorm()}. \item New utility functions \code{mpfr_default_prec()}, \code{.mpfr.minPrec()}, etc, to get, check, set default exponent ranges and precision. \item New \code{sinpi()}, \code{cospi()} etc, notably for \R >= 3.0.1. } } %% \subsection{BUG FIXES}{ %% \itemize{ %% \item . %% } %% } } \section{Changes in version 0.5-4 [2013-10-22, r173]}{ \subsection{NEW FEATURES}{ \itemize{ \item . } } \subsection{BUG FIXES}{ \itemize{ \item . } } } %% The first CRAN release \section{Changes in version 0.1-5 [2009-08-06]}{ \subsection{NEW FEATURES}{ \itemize{ \item First CRAN release on 'Publication:' 2009-08-14 20:24:02 \item new \code{pmin()} and \code{pmax()}, improving \code{seqMpfr()}. \item new \code{"Math"} and \code{"Math2"} group methods, notably for \code{round()} and \code{signif()}. \item \code{as(. , "integer")} now works (via C \code{mpfr2i}). } } \subsection{More details for old versions up to Feb. 2015:}{ \itemize{ \item See file \file{ChangeLog} %% ../ChangeLog <<< } } } Rmpfr/inst/check-tools.R0000644000175000017500000000210512350354137015006 0ustar nileshnilesh#### Check tools -- notably for Rmpfr #### ================================ ## to be used as ## source(system.file("check-tools.R", package="Rmpfr"), keep.source=FALSE) ## Get all the (non-Matrix specific) Matrix package check tools: ## (needs 'Suggests: Matrix' in ../DESCRIPTION ) source(system.file("test-tools-1.R", package="Matrix"), keep.source=FALSE) ## MM = ~/R/Pkgs/Matrix/inst/test-tools-1.R ### ------- Part I -- do not need 'Rmpfr' `%=N=%` <- function(x,y) (x == y) | (is.na(x) & is.na(y)) all.eq.finite <- function(x,y, ...) { ## x = 'target' y = 'current' if(any(is.finite(y[!(fx <- is.finite(x))]))) return("current has finite values where target has not") if(any(is.finite(x[!(fy <- is.finite(y))]))) return("target has finite values where current has not") ## now they have finite values at the same locations all.equal(x[fx], y[fy], ...) } ### ------- Part II -- do not make sense or work outside of 'Rmpfr' : all.EQ <- function(x,y, tolerance = 2^-98, ...) # very small tol. for MPFR all.equal.finite(x, y, tolerance=tolerance, ...) Rmpfr/inst/doc/0000755000175000017500000000000014136173546013226 5ustar nileshnileshRmpfr/inst/doc/Maechler_useR_2011-abstr.pdf0000644000175000017500000012656114136173546020226 0ustar nileshnilesh%PDF-1.5 %¿÷¢þ 1 0 obj << /Type /ObjStm /Length 2826 /Filter /FlateDecode /N 43 /First 327 >> stream xœ­ZYsÛF~ß_1oqÊeÌ}À•õ®KV,9 %ßåÚ‚HˆDL Ù²}º‰ƒ¢ ­Š–1gOOÏ×ׂ0"‰æD¡ÑD„†¢¬#–„,$Žpl 7šÿB)çDàx.pš$\a¬%È8g×D2uC¤PœpK¤b0ÙiŒ‰âPŒ(-€0*XX ˆOÊX"Ñ–šhç`Q`ÎϳÄhdÂ2x†ÄJ`F2b-0!9±ÎÀb‚8æ€Iœ0˜ N¨kâ ‘†8‚,q¡ ‰t$䨒P0Eƒ§ƒ''¡„~%H¨”#Àb¨¸R$4Îýë·ß=‰‹hì„:"ô4šÆ9ÖWÎ\Å„îAÿ<’/ü”ëb–fäɯГÅQ‘¤Ëý¨ˆÉ“ýç‚ ÎA„À½æ)¿0öK=çGçñò=)fd´³,¾$WÑø+, Ã^Ç?¾§Ù$÷´OÒÉ]dO³tr=Žîáé19œ¥y‘³äª a uÀ`ÈÙõÅ_ñ¸ðÏ“bc©ÚÈ^z½,‡uXó3)%ð¥Þv)‰zÓËeZà Ž‚³ñRP²œ SQØK—E¼„ ªl9O’h7½ ~:ÔÀÀ)¸'œFŒ¯å>Šóô:Ãò¸öÃÃ.Ï'KÇgqtèéþðß@àÅ‹&Û5×»QûÙôøýÁñhôtïdúr9N'ÉrŠHðD’,/öfQ†ûòëíÇ¥$áЪ…£j¼£\ ¿. "™3”žXk.½ ÊŸ Cÿ‡eì•€V|2?®þ+Ç®Kåˆúga¾µ¾³-ô™ŠbÙŠ?£Ds†6DÛj¼Ù6å@8ÖbÒ3aQéMõ]}­Û+v+Æ]5ªî…ñ tŽi¿M߃‹Vì Í/+åc›Jwõ*N¦3¨‚=¢(y<ö't‡îÑ}ú’¾¢ÇtDÏè9}KßÓO4¢QA/蘎Óyº„ÿ‹ˆNhLã›ñÎ@upÛ_ÊÞƒdK¢\…Nhy-âŠÀ*%ãå”v’ä9`ÚCh0·ô¬ˆïÀªë&À¦* +-7hÌéûßß¼†µv?€nè ëéLØ#öt†oЙM‚ øuÇ9…kº-³­Ay:n¥  T@{ – –à7´¾µ\U‡Ò—B0J~lÕ‹pFêªj¯ùÁñ=³6È}µòS€wÔ@t\A¸‰Ý«Ž5 @àwú£=p´·BúBØ!.ÞF^ØC^ C±°¾{¦½woöÿ|÷©\5±'ºØÓ®G"Œ.øì`ðmþ0rAsò5öÌvÌj } Ä*C³±V/Y>}¿-m»²Òk¦ò‘ëÍ33MÊ0öd×2Ÿ¯é‰ÇUª $qçIî†ðš{h¡e+úhb[Ðä½ïÃI×&c§Î6eöA¦ìÃ§¢Ùt 0Á±/w–y²nXÃJõM—X¡—„* -þuÊ@LÛ<(_]º%ð) é¯Do´6®#~Ä‹õ4Ú¢ç]Ñ·„1Pð–ß"÷ž¨?½>yŒvâä¨)kY”µân°îJ8(aöÕ€ƒº5¤[VWÒõáAÙ!5Ä«XÝØ/€C¤Ó–°èJ¸-ƒ"†¸z ˆwFGž¼iÚFÞ±éDz¼Ìâ˜ÛcY]a~£ÐÑVu…®BÑzY] =/¢lž»¦í÷“Û’V]I·E1PÒî¶x¨'é—{îî ª´½ìJ]bWÒýh»¨õQkÝ ÷q/ex²Åå4úéœÿ[Õ!ÑÁçšZðl¡‹*ä ÄŠÒÝɆòíÒ”îÞ—Á,ÔœŸQîçyþNB”^ÍxwÝ\Ö3ÃdgõS2½j¯Ø†ùXr°l­{½wß,Cå7\·YKaý_¹Æ}ÓŽ]ˆÉè!$GzœÐ7>B+wu 2¾.â*f[åËI”ÏÀ·^&ôÒZâ¦Yô-~p6²-i…ƒy+-¹¡?ú‰‰^;•ž?÷ÇÄÂ~b¢MWÛš2Ô³Ñá&w~|¶÷ò,v~ÔÒKYçKk½ì[@ч¦&ÚÙ­:w÷OêÛ)ÈV`‡©ù:÷šfu᯾ª1ÆâÆ­@‹cÁE5gv¬(›2ÌÿÕe\·®×<P¾l×^I^øþKðUÚßõƒ&Y¹ A¨×žÛ• i­D¨BÍTgâcÑËy;e_'=%´7ä:z³K,—½€gá™iãÙvñÜØàø”Ý hHaz€½ÿx„nl·…çmªë{Ñ P9W‘mõÝyORݪ;Yb­ôP py¿tdç¼ÀmÇbª>G)ú˜ò©P?Ëè]—´å:ô…ºÛ*±þ!žî~Üýã½Oi:viÛ9ZÖ?Çnì6Ý7nøL¤êŸIÿxSö·Šæ #[¢9¼2k=jÖërYo×Ö£»3×mÍÞŽí0¦Ùß¤Ýæ¨»òf~›#{¨CßùVŸ­hçÁíLm|D}a± ©þ¾Žæþ:lŠoVâ¬é$æqž{O±¼^\ÄYžLïwË[ÞéÆß€\>Ýô'±ºÑ­_¬| +»5l7ÚRÓËÇ{íªAtÓS[)°¥JjÂyž·;¯Nß½E?wõÐ}õè%;ÜmUq‡zlåCþ†¹µ6ìïî¶òðÖÿGA0€º Y4þÛU¹Dw3¦òó}&éG•‹4¬¿ªk™€²lÒžRQÖúo>ò9f7 )³,ŽWéÆ=ôEUê Z_]êT{¥.Ä>HY ^~P˜vòöÍÑǧg¸4¬.ý‹.ÙÍAäЋ®X­;—²ºB‡·j(…y<ü*Q2ëé´Ï¢wýÒÈVŽqU)u[ÞWoÌ¿ö=ƒÃÕ#wÆø¢½lz²ˆ’y‘>_Dñx6³ÿæET‹¨˜q1ûŒg¿ú»i6‰³jO>ZÜóNüÞ_Œ†$Ñ!`»ÀB†#´ðê r¬@2|q³>šãdùužÌñ¬(®òç”^\Oó`ôì*Kñµ|fSlú™Ì瑤ù,ýþ?¨ãiòŸdòo®TÈﳕпà áÊB+"”´u¸ØÈâê2óì߇? Ž_žÈ@àë Åfð  œ>2‡ÓÅÕ<¹¸7Ü/€¥´ø± ŽÆé_V?"‹™—bö옌áلŽx6a€_è(ü€ÆŠÀ€é„àÊ –GàTxµŽðˆD]ÖøPUöUå? *˨6õ\HCE=¬•¨çâ}]=̽¨çJ¼v¨Ê`uª~Ä¥†Þbm÷“ËËâ9üb䳿õ¹œ¯?dY{1|áÏG¢‡¦~}I÷HDñ/׉œaZ¿|4šp( B¦¼ý$å]©O¶ZW˜] á+„æ…gy‘^^ª>Ö™ôxè-ºq¡Ka´¢endstream endobj 45 0 obj << /Subtype /XML /Type /Metadata /Length 1395 >> stream GPL Ghostscript 9.55.0 2021-10-27T08:53:26+02:00 2021-10-27T08:53:26+02:00 LaTeX with hyperref package endstream endobj 46 0 obj << /Filter /FlateDecode /Length 6837 >> stream xœÝ\Kwd·qÞóx•üF^èvÎt ï‡Ç–KJ2Ö¨øk¼h¾Ç"ÙT“Ôh’Eþzê nßæp$Å‹-qB¡ê« ýý¡ZéC…ÿ•O®ÔáÅÁ÷šzË?'ׇŸ|ô2¦UÁðú0„•µ*& “(øÓõÁ·Ãg‹¥ZY¥t¶Ãf¡V*[㣶Û3ü‹¿˜<œÀ_tÎÎ¥áš&e«Ì Gœ.–Ö™•ÒiX/hþ½Ç8Bie\ÒÃôûdBŠ0 ôG¥µÕÖÆkg=¯ctÖ)ãëô*çDVò1d7lK£ãJ=¼zÕÖ¹Âù<,TÑtFë ­)ÀhIëºm²Ùôôu;æMDïÍðv;˜ÚÇá5t»äBðÃMù6eí† ¦6%?܉q•cÎÀP’a¾P6ïÞ!JçC¶àÖ X[·.¤~•Ó²ûºyòœÐë>¤5'“€$d[NÞÆáraÒ 6åêÝÔ¸1¯£µyïÆèÐBÎ1ãÜW‹¿ýûñaMA;:±’<7FSÔÕ7mâãÆ±3#£Ð,ÈœºZðã(u’_÷Ì¢¨mÇ£oha$ÃI4ÒΠ;©’^ ú¦ Dk0Ø]vªÚ|z¶ùÁB*4<ã¼ö°4±-*‡Õ8qþ´Hn³ ’úíÁœ½6RÖNðü4Ð92ÖÀFÆ5”•A2£²¸©A žÕr<¬% Aö™ì“Æ¢©¬fÚe&ßÀ®ð¥öªÖÔ²I$e˜×üýÑÁÜ*§Ã7\_„`WF1³ÊúðúÀ[‡û­=W_ï…·|gl´ïð-éUð&оόoŸ°BÀO$' ǯEÿ=õ[ç qÙƒÇR6V¾Ô:òC’Dh^¾ÖDzà‡<¦Ùu2àšÖ7 Ⱥ}¸oĬ`”7¬Ù. ëŒ4Ò,uð “ÝÃ17i>ÐDŒhÝ—L“‚æË.â"ÃÇÜ ê7¼XXä >rJ+Dp‹rfHj@E–»fP*9+–'8ü Dq Ha´Ó,“Òð`«§ÊÙDÎÛsDså2¬´mûþ°6qò^j}ˆÂœ@‘Yê¼ Ñ"î8‹ügÒ€úpø4•G°3Ì0:neor ~&UøŽ¬™âx·r–Áï}0çþgqô×ÄÌuJ‡âOßkঠóȃ¥ÕlÓ§|vŒS`±Àd ÂÊÎì!‚§¢Y³03‡ ¨É¼€®6Þ•O¼øÄ­Œu1ŽÈýO´YÄÝ03¿YY¢<6ïžÙ¦ý3ÇCƒc3›UÒà_ð'¿m¸ÆŸH¿fiHãÆ,¬¤ò¸Y WκÿzàHÒ‘ðx¾,NX˜?3u*:øÇ€-xº%ÎÞƒ½ŽˆÃ†Ô¾Ì 5¯†³_Kä”þÄ5AE´)±vKsC+§ì¥ã´Ý©÷§tw œsˆ^¹$y"9ƒý“QÀFã‹ÁÀv¶òÕ‚Ôâ7ól4±Bfú ²9ë ú%ú4üW›¼ó~¦œŠ)cwüŸjÄ4X>žýã·Ò‰SY,ä~/·øp¤Ã¿’’vý€çìcÝ ÇcÓØ|+OâºÀNpýñßà„°UÛüÚ#tBr¬ÝÀ‘¤ƒ<>1ÕŒº€‹¾îÿ·£!ˆyWQ[ƒ¸´è쌨°'7ì++]ýuã/‹Gò*ñ^ @Ÿ‘„?ìÍKÙ/¸ý¸}uؤoß/ÂÑú´9 ïØE€<¦²y”5¼-mbO£”I:#0`]·¿ZAÚSP¶ jØæÁ€Ð9½+1#ÙtcbòÿuTI2:ƒHðauÏ¥ÚÜ7•ìÜe¡erIÞ§²¦s ¿÷³º·ÓpÒ§°Ržyý…3°âXVIyôH8"@ðl†Pe³@ @èØéÒ`Ñ¡oðN˜à›1,Ê%M!­À§2£¥ùdK,¸x,fAƒØ,Ð Fÿ2F|ÜJÆÂ˜ã7ˆøNeïEa˜ãð%‘– r¡m±ìU>Amƒ­…É:Dœ°ÑëÂv•ÐM(}}Ƴ%ro ´I,ŸǯHTÀa+²~\(®Q ¨ÛÙ±g<+SÇžJÊ\z4ÃàºáãÝe÷›æJÁù¼qS,½Yß³@9m-Ϧ3ÓBéÅ’ÑÍÙ€ˆn¸W^-) ØM(‡e­Çˆv” q4ÅóL®øeÒ[J"¸ y );U#€pi9e!à¢äŠ[{T°ÇdÖò2ÏYÓrÓ)žv;§G_NG÷*AB϶ŒæSŒ6’”ÀÞ=Ð>º÷ ûB¤ËêV·°J¬ŽÈã1?r]bV,^FaÌzN¬PHE0PæHµ Í]_Ñ!pt·A¢s Žƒ—⎃O d'ý7…c©“QBÒ¥ÀßeÔz$L$æƒêh¡³w¢ËÓÌÉPÐ_Q-,$ ÂOµ›ñǤOÊ`öp…:€Ôéa°¶þ<À’{‡óOBY»ò.w‹<@XW’ÚkìŠS‘ès&²ðø÷¼)̼xÀÛ!K‚Ãñ¤Q/Ié—Í`€gç7S Þ@ÈEÖlV („ëZ…”wˆÎÏ¥Kˆ;ò^ Ýœ7õCà@b€,¼èòÍ;¢rrÖ°%r%'¢Ã ì/t'X,wÞ<+ ñÖK$Z'±S (ŸMöhL…fžˆÕ¥r¿‰êO¸9Ö— ¬äQòpíaÇ€¬{£PÓ¥ž¶Œ EHö>#ÞwIËrCzƒù¦'a4±•â ÊFÂ[#)ÛßñÒ/?[mðNζæ¹°¯ød—M?ÏÊ@<åÎʈ/(h p~ÃWß¼Z”e€ñ"pyѤêó&U`¶HÇx#Ö:öÏ`J _†ŠxAx{,Yó©ÈM‘h £`tD!vYö#e¹À= Á>M):gg9RÉÒŸÈ=c”îamNŠ€4€Å!H€ÖÓvǽèØpôǧý c$»¤õ¼®ù;Ìc Ú`‚1 x:¼>+ƒï\!ܯLþÃãî…Ö8Wuå5.¿»D1‰ ytmˆðÛxQæMEKw%sTY·‚¨¬Æ/KÌf4 º^Vn^c¢ 5Òcv€y .($énÑÒ¯)²mW£ôfge?‰¢@qjõùãtÆU†-W:™ ”:Ø,<^ØrùÂkOï)J|&Hc®aÒ%x‰T^𣭅¤98Ú•sˆeæ¶â“Á·Øëë÷[+µª£ÏÛÅnÅ ˆíÓØ*4òí4™Dš0M‹ ñºïÃÐãËàÝ!š>k@s°b¡€sé¾ãn´™Ÿ/’¡Ô¢„လ±îYò¨šlDáuVå¨ .-Çœuõ6O¬k±ó€­?´˜¿¥C®šëã¶ñIÆG±?ûÐ goýª¿/½M¬ÙÈ­[o|%ròÔÀÿç_ŒÞ™È+=Ç¿£àv1]oërÌèñ†®®q7ïB¡Û¤Á»> B8ïÀV˜³Þ£­9:ኜó¶aÍ ^ãÄNw‰É‡j¬ÅÐ>3‡_•b™wØq+˜[õ :hŸ¦.G_œ¨Qí¬/›S˜ƒÒ³îKŽš)õâ¶ õœ0ujö‹Åã8·ÇBš¦2¯ç•BHA¬Šx"Yt?ü^âšU/Ì"­ó ¯KØ'"@yöXKPHu&s‡)[JrŠÊˆ#Úã.ÐÞ`Ç< c)xMãuÑgÂ×.Î_L¡Ý÷ùû"Õß t QM&ôh‰Ãt*.λOG§„ùIÈ=ÞNIl©A_™ØbžCjõÅb.W Ó*yÿž¹Êz&žî˜r¶dž8yØ :W€°`#å£p;Ae¹­oZ÷æ¼¥UrÒF”±IHñ/ÉQô«‘i´v‰T7 Äš8뚃÷OÓtòžmV.ø:ú— :;¶ÜŽ:w!ý;µsÛ\ :*Qêa=²I{yÊ €E¡¬Rg‰°òpyD(ÞÇxDÓ‹‚gçSU'$úïa%p:]îãÿ,Iˆ§•i:ê3»uºõéxÿä9+ƒ)·÷©£teò•“Iõ®Hwü©©ëÎvÓß—%,êR<œñFg>¿'é41pÍüã–PÒåuˉÁ–øN,½~˜ê½ÁÀM—»è,NCÐ^c "ª~Ž×—p(=OË¥³œkýDÆTæ×èÔu'Ú% æÐ‰¹dÜùØå˜q’9x«)îšx˜ÁhªwXŽ\ê!ƒ+aó¿,–Ë“ï“jàØº¯­×µÅã’Ca[wµövlžÖÖëÚº˜é»Ójìð›ÖÔõï±-³¨Í_·‘m¦Më,» Èűõº¶një~üd¤;7­ó¼v>ÔÖ•hÕÔÎ;1ùØZÏ,}:ó×­økúeíü uÎmð¬¶Nf6}'úHøÁ»q¶‘A";gåïK­WÙ¯BvVU:¾jÿ\;—í4Îë=ÌÈÑÉŒP¼‡ºû…·•”Žºàuí½­­FÄöñ‰ž½?—?á÷½à|ð7­iêßÕL vS ¶€÷ztA÷Ï*£œÑaØØR{ˆ„ucJ™0" ŒÀªŸdƾ­3èÚúK[ÔÔÎvøM?›Î¦Ú23}OçjË×V®-õè8½˜ÁCÞkú)Üì÷+|5'Emk¬ÞÅxøêCø«Õò¯`ƤËð!ÂN>÷+c²¸Ù¥ú¼¶¶eýnƒÕ±civ ¤¡ÆMûš75;®­3¡fUôšŸO1ºWÈöuC…†w3}·–Z9zé1¯[¬ÇïÐU.AiÀÏÁ¯Ü_þ¿ÑŽ6Ÿùkë “ùC·©¶bm¹™>][¶¶üÌ|a¦effÎ3kÄ™™ã£³´¿ª™™­ …žêDa}Í*ç™Oò s}sÌÊ2aî¯Qüu.ö\Ž/ß/–"¿Ûæ¤ïÉ».ër"2køì^ƒyù”Ò"“,…E¨ {nÏø+Ì?©Þ gÃðr-‚ö=I=Š-fQc_³Ó6Î¥‚tÿ$‚HžÖð¼,n³ jv®–Eœ¨u¯{O¹Ðï˜[F ¶õiw©Z³²wÝ25þ’«_œvÝÆo[(³i‘Ý[yýÛó‚¿Ã¤q_,B£·xÒ,Â,ç3š,&ØÜ•CÄ[ÞÉE0­²,TêóÀ“ +¼PtòÆ@ŒžÏKò&E-²©lµ¿o”úðÄúív®§g.å4ÑË>¨¥—Q"ɰj^@ä.DW4ˆ'ï°F>»½i ¾« •T{%%.=÷«œðe€U¾ ê§œð·Ä"Vž¯•\¤×®;ŒÃ¿‰ ¶›²A¬V8• Œ1Å:÷°§„©8û1uƒû{÷ÉUœí/Ç ²vOÊšòeÛûdM1ÁÓj<Që»rXTÃ4›þéot\âœÛÞÊΚ¶>mƒ7•ÕqOú—9}þS›•q]ù+> 4‚Cv³|X™ä&×n—4.8Ç »Ò¼jÍÛY‹‡™dkk6gÓ2|³´¡ÏsOÈ1_ò–æikžµæ³½W³D9 4ÍM+Njž=t}Î~ir’S?x¢:“u¢Ë.¼›Ÿ”)`w”‚$&¸¸lBº”tž4½Ïjz^¯¯*,¸i3U•îC袇O+{¬Eˆõ^RïäÈÊ A¹˜ƒã-Ä”çtïªí”ê>YͤÎ_•IÍoñÕåS’ããâÝ%8×ÂᣠwMc¥³Â~\Ì¡»ãiÑ/›O®Ëݱ^<Û‰Zî³~se`cáÀ7ã…Ù0!qtË@çÕçÉùN¿È]éC´¸s¥O—~t%ŠžfŸ¤Å­%?[®`,få×wå;åeñÂú¶Y¢Þ2vésöÂï^}ãÜSa{»êr©,XÁõë¥È×íuÕŒ]â›’ÒQÅ(±}·@•DBfÃ÷ÔËɧ6…IXr±'_ߙ̺W~:¢•E Ê|5òrxËa㲪ƒ /ŸKµœP™’Ö“îßµ¿¿e Ð¥X³Q¤›>NÀ!FÿªqëG¹FsYùˆ.áëiÿ zÜXï%¾ëIµÇ-Üyè þéú&6­¼2ÃJÅdˆæWf/š¥¶î×­©[ÓÍ6³û´7p³Ôi¢î'äMêÇ#˜:Ct_èO\XHza¼¥,q~$‹š£åE¦—~²äåžçH¦ã"ÒP­é=3üO˜F¦_±«,§ÃSoèçºkÈ:óþ§6ÁNy´Ÿ><¡Þ~ù®‰«ê"z_чÐ^AÆzê¥k`^õn:Íû*r1¼%ux-¡ùma» {!í¶…P»õÈc­uoa‘?¹{>ØÌß¼¢´UG½Eõ»oÆXž·˜§hÒö[D(ë¾`éG¦& ±ØIUý±y]ŽK–ØÌUNKTÊK\áõì&ô€cõeÍkqè°s­=ù%ãÓ bìÃ%®Bj1œ×àÔ—ZÏ"WçÂBœ•Dædè58”ÚvÑG¥ìDt_Ö:Æý³åÜ×;µÏ¹Œ \Ôe¸dn(z5¾ÏÀßI„8ȉËK„™—÷<æÛ›q¨ùàá´`öPTÿ¬b<­_sFuÁ¦ql—¿?*ðügÇHÖá+løeYK™GP}–Ýæmk~ÜšÍ6¯g?;oÍí¢æCW­¹iM1à¢5?ú9Á—ÃÛ¨ûmOÌ-ìã›CoËå·00¢v²¸ „E–nïÖ·¶’ÓAÖ±{ LΡä#w„TCö×sãtÎö<ß ,žÞnDò§OiUË%ÿ‚6’•éý¤¦—ëk& ³T?Ãz§ÐÉÕá‹æy~%hüu ÏLì ö"KnbÕçQ 8.›>ñCXhÃíè¾ZŒ 1® =¿i(˜ÿÐOØ“ûi¢“²ŒÝÓ´¶-íð¶­3ˆ)ZÞ1:ôÉæ”gÀÒm„¡»)lPl¨ñX\ñÏDÝÙI¹`Ïr¢ ÆdðÈ'ùQ¶Ê$ÐâEÖ½sæøT¸Bs˜’ŠTŒ(¤ô¶…>æ‰mPã»Àw¼à øëzú1L¥ >¨êˆ?DáOß&JP¥¼Ñýló¶5ß ªïÂ׫Ö|ݚǭ¹jÍÍ‹§Kü,¨51C ¡{fLò\†rɤ¸¶–é-J<㺀]”nL9ª@œ,ÍܽŒH“êéo8ì„× š°Å ÆqLˆýmu U®û6x|²@n®CDï$¢¼ ¿Lþ’‘¼ä&ÞØ ¬{hþÌU¸éÛÎmOÞȶ×wÎ;ªL{A°‡?_8ª^HóÎѵú˜Y÷/<ñ9ÆäGšþ&T›36ÿ>¹ªÁ_|‰Tøìc‹ ¶‹­uÏJ± í[VÌ?'…è6F1h*ºÇCvTæþ~‰öY²_áoûÉXbò[»?ˆ ïò:CùsZfP«Eýe%'ïEM}I~y%íÆ_‹ÅþÉ0JÍyp÷D7uŠ¢—408ùÙ;Áõì)ó’c$eÛÙ%þ:;ïɬÿ7³˜1 !öçØ£,Íüǃÿ˜êžendstream endobj 47 0 obj << /Filter /FlateDecode /Length 464 >> stream xœ]“ÁnÛ0Dïþ ýe‹œuƒ—ä’Cƒ¢íÈèYPœCÿ>3㤇†ÀXæÎ>.¹|~z^æ[³ÿ¹]‡ßõÖLó2nõýú± µ¹Ô×yÙŽÍ8·/çuxë×ÝþñG¿þù»Ö†¨ÓÝ¿ôouÿ ÷_÷=Ãu¬ïk?Ô­_^ëîܶ嶭.7?5?%=¡y©ÿ^ãz]µ«¡vŸÛ:ë endstream endobj 48 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4901 >> stream xœW XSgÖ¾1’{U„j¼{ƒk]PÑNÝÚº”º‹ Š "²I ¬‚¬aOr6Ù„ÅDÜ•Q«SÑÚÑê´µSkmÕ:ã¹ôcæù¿;íüÏÌôÿç OØîùÎÉ9ïûž÷“0ýû1‰ÄÎÍÝc®õ‡ â¯$â¨~âR †ª{ÒìÀ^ öý[G9 Ї`¦#®‘J$¡j7UøÞÈàÀ hç‰~“œgÌ;ÛÅy¦«ë\çE¡þ‘Á~¾aÎî¾ÑAþ¡¾Ñô¥óz•_°ô^ç‰ïEG‡Ï›>=66všohÔ4UdàüI.αÁÑAÎþQþ‘{üw9/Q…E;¯ö õw¶Ö6Íúæ¦ ‰ötvWíò cÆuQ˜Ê-|ë‹#£¢—Åì‰õݹÊ/~—@`Gðú !žÊÐM3fŽ™5zÞ¶‰“ºLæÊ0c˜5ÌZf³Žy‡ÏL`Ö3Of³‘ÙÄlfÞgܘ©ÌŒ³˜YÂ,e–1Ë™·˜̯™·™UÌ,ÆYÍÌa†2r&–Îôc~Å3˜Ìhf0ãÀ82C˜´¡L&G2B’(ù¶_d¿ßJ-5õwì¬?±«‘ÙÉÙùì¸ œe€l€Ï€¯~0°ePœ½Ä¾{°óàëï;Üs\ëhxmÃQCü‡|«T³/@›™™@Bz:¥ìŽš¯ã”ì¡3„6¨Ñ]О²ka=ôñ¨‚BCž!¯ y',‘#SrSõȺ"%Û™sŽC'äÀgkP<ëêÂÔŽÌFOž¨e8ïÚ9ˆ×À"ÚY’LC±ÿ- ¸5\Þ‰«±„ÿë'g®\,ݺF ìv5,§'vªô'à”êÎö•±"Agáp ŸA£ª-ºÁ¿t LƒK’TœN&¿ý„%ãÕvJözaÆV1þÛƒ–«á¸ÂA,R7ˆ“M’Æûxà¾TŒÃ`‡}A‰|‚3F†¼˜ˆŽ(ö K6ó[À×}8¢]w–~ÒƒÐm:ÚtúTù膣!ÆàZ_ýfð…Xé£Ú¾=Ö8‡žøKÏT‹¤û¹˜e–ŠÏÅ¿ó! €#Éò6ñ&;q™‰pÞ÷ø(‚¤dÈHÓ)Ò‰ ±_4¸YdùYlÁf\qö³ïþ²ÌªS’õY¥ÀU@^µ“ÙýP˜’¡Ñ¤e ´½d£]Lâë–ø†¡/oaÍýáòm¸¿â[sÞØÜK3CdKßšçí_ߥH6‚ª¸¥ýë#ZwÂ~ßàp:é)è¹%f§¿BÞr…%­½‘Ÿ¹CÑô íá Uü»ErÃ"®±HÅ‹=#ù}%4K>·?â„^_™šÄØ5È P~ìN£9gÉzÇ÷ö¤§€2Fì-£ ªdûÑh§’¥!Î…¬¥[ sè©KÄ"Á1_Šc¿“^éqæoÔŠÞ6@«ž/D+EN†‹p NĵèA8ƒ| èå”2Lû›„ߦ-hUˆØVCA—ðRö.m6[Wîa'ŒÙ°xÓR·=«¬s[CùrÉ‚-­t~€> R±§ç]¾÷¦²VÖ—°ê ¿u`1-4’Lp# h¡Î2["¬zÄ~[¢|[Ñ€•*ÙÛ)ÊIÂ4L—Ù’ãHºBƒgqædâ„YñòÆË?Y9±÷òG‹ñM” :V«KH(.¼:¾¶º¶¼©9´É{¯¯{´`ý –Œù ?k(ÕŸ†#P§»b›M,û¾¦ø Eý$µIt­‘´žÆäÓR|"Îã­øÉÒBJ² Õ¦¥ef)k”ùÁôs8í~sHYDmŒ¢Uy(ãtÚéÔýššø¢tSøsoM€¤ñ_œK4Eºüà’ }¯‚ cã!­$_¯¯ªró‹KóòÚwטèŒ;n^ëŒ5ÇÔ*‚[ •Eä½_ Ý\smûCd æD} dRX—AA­s,e§Ü‚sŒ’¿Þ‘ R¼#Žã-d<®R±ºÙAã&k¸È/I#Kúß‹>{­íê ¡[åÉ.R.ƒ?U ØÄöÉÞ‡lµØÆxåT<(²<¹‚I²ƒ†âÛB­Eæ­YÛék=xçÐ>)kÙÿ…(YgÎÊ÷ãp:mÊÍÎ×ÒNb^!e¿ô”XÃþB&ÊYµ)‰Ž¿ý'Iñ~æ–•ns²:Î ø9K¦XG|43d2 +À÷xPcìÑŒ#pNÖ6^âäqú92œXlga—¦œT ¾Š±ÁÂA<¬®GZ$FQ+Åeˆ¼&_›\ý¨,ìm´Î‚ m¥±]TîËpA§ü„}šB(„}†‚ý8 ï9UŸn+iÓs6TãM «¥^e°E5j÷'B¤ê´Ùê±$ωêß«´=ë¤=CðK¾æòÑÜjk¬ŸF »Á’À¯/c‡®,b!U›©É˜Nrœ& ™j\䌨·êiÛ5;é¶RÒCú"šÁ¨+N*T—ú´YjÐÍ%1N.XšYNÅ&w„ù°í³m§ŸÍæ ƒà¾8ªWÚ’`äÉ_òRrRË¡r‹s‹žc‹Ó÷¤%75W]#Ê!§(·ˆ³. Slš¿n3 í¸ãõß¹u³a¸ÜKoòy¾À™®”ßU\Pm`Õ°%0NTèÆÒ½Ðê}4 Å«| p³û®TVÇ×›«Œõ>y:…¹þDa#p§»ýßRìfåõŒ§vaÖ²· ˜MàÇÍ}~M 9>ƒCç˸´ßñ“†úlói=õQ÷ïqj¾Ð‡šjÑÙ„íT5ÐD…¾… ýMžŽN_\ÑzüdÅ!è€#Qõ¾õ; k!¶enŒð‹ Ù©ÜÞà_u0©ôTûÓ6ðŸSªs?‰ÿ‰ÏˆýÒmAáQ º=®½R”z5Pb½þJ‡)«P‰ŒÅ¼J¦žD†’¥ÀýºOÅö`nÉC¡Ù" Ò¸‚žû¿c™ØHUp›ºSˆ^²>b3p+çž¡+Àõn×¥ÒsÚH«ìmƒÑÁ$é°àeZðxq,_Xl… Wž ñù#ÝIsèNÊ^yíh'úËH[/—FO¥'¡¨¢<¢+Ƀ*}*‘&o&C¨BýÈÞ×ms u›nÐ9ˆ#О‡½ IÜ£ôÞç;À¯.¢=¢C{š¡+ÿlý‘𿣖³ÐGö˜ýK@q\Îe>+ßûì{ô`GçI„'CžNÀAwvTWÒ1¬dqÊ?è-¾øùLÄí´sAu8ßæf4×¥â8º?jò úûõ©•±Ÿ:–¼F†ÿåMt@‡“/k ²òÓR5Ù:Eðø™ÚDð‚æèÖÝ'u— Ó×ñ…8íAEœ‡K¾z2ŒsÀ>׆“ín<úJŠgmb<íØ‡';;ŠŠ´ÙEBj6]S‘\DÕ^“¹²ªþˆ÷æ®}S ì»ÊOÉ~a3á-–²ì4ãª+w͘a–4^ÀÄÛ­¤8—ò¦Kâqàß¼þéIUkr™âÈ.(,MzìåÔqµeEÕUI¿0ou`^³«ŒZ0·¥ïnn ¬HThµª ŠÀàŠ@óÞÍ ~°ûà;†Ž9{ûhܱ€:a}Û:p¡"醰ü83UE^ya)÷<›Ÿ ßÖ˜ ­ûëåFsyp`rt4Lž¡8NæóÍ訛ç1ß{ê¤E]ç+Š>º¯èsº6XHút]Š+{Vð?§RÅ6R¸‚ýïmñ2ؤ\Om±C&Ƥ±àiž¶ ¥Î ‹Ÿº?ÿÖ2\{ñ%E,Ô «r ÍP Ü}”™ô¶Ï*2J’Dþ±ùÎE¸Ã}Gß#t–?Y Ÿ6dWÎ)°–DßÿiCæ°òV´—Ý„fÿÜì¦H„h]>'ü».A1pŸ—Y—%Ôñ¦¥ëY«”QJÚ{µ1}ZMÚõÌÎôÓ®iÅß!+þÚÑ™¡Ÿ"³ˆrì®Wódœµ›W 3©õ©þ±C†jý1¨ ä:i+‡]‘wX!–#⛢êB•Ñ‘aaµ‘–¦ºº&«RîÚ é¾Š÷®J1VœÅ¿cŒ¸ Ǹkç®~Žü™)Ê„œ8}V‰ÍšPÇíÉa_J†N—’!$ï-*ݽ)Þ¸éÔT«Ìvÿ^—W^–¢Ó§2 ©îÅj[‚õºÖXË-ݺÐu>¡‚57]ЕC~²Í4Å*ˆ' é%z}IPZ™šÜræÃ5Ÿ¦ž¤*äpïéËî=Ç¢š;Î{¯(·^)h+ÈAÉA ?À"‹´gaÏ\þo¬,Öæ©Ëp®±'ÓÐEÚÊl}*e$U0$Žv)er°Ý @¿°ug;Ê[­Fêõ…ÆÜ"ƒ*a +#smîô0M)kˆvÉËRjMCy1‚ý—@>f0éÛá(˜t?ò3öê¹'dxE̾H‘ªIQÚ¦T§?L«l†Æ¾)í†(}à 2=¾ýâøáë9Ô&Q›¡¡÷ì³庒 jâ’ÓÒi3Šéì†Ûö•')Æ‹Ïø_2vY2Fßüßx*`/Û]Ï©SðÔ&ê¼`+$ë×÷%{^á ò”%£&Ízs±kÃe‚ ‹=’v«JqÕbôqè‚ýº“ÿt5zòóëo õk¸ü¤íŒÌS—ÎWîZüŸ¸þ£.üŸþ™0| »î©ó+Ùn°ÕWµ1å¢ßÙðlÝ´g;'¿§ûVöÿ¹:ÿp4¦ºg´ERõƒAÚ“†ÔRÏSt¹šj»,Ý`¦ÍôÖl¡.cd€{Ÿí: UÚâøÂdã2ºìtjÉèÞwÈl1‘=5zÿ.²ŒPê¾½½NyIy™%°šÑü*|OÌwÂù½9ùñ†Œ2Qyùye¸Q¼ëTÞi6]´ÚL¥&¬š¢Ò¯ëé]m(DC–6[›auwt)~boK±»GΛt†HÁ}åtÄ)Ù*¸ çê¹^êò5)Ó„+}¾¢è> ^‘'„¦)±Ú‹"¸‹Ï_<·HN¿À?KŸ˜:"mrúÚä„Ì´%t©pd‰ì»¯q޹|ž@Öå.q$ì{®®[:² kš*4í©Qfi@—-ÔݸÚLíØó6—%ãçÏñÚ¤ +ÉVµÕ‹D唑EâÕ¸ 7¡›IŠ®âüÕˆvß ¸ðððªð¶ÒÒÜÂbÁ`ÐëõÀ 3myèj/oº5Èâ²ò3 оøíÜöúF+ˆi¦Ïþ|„ºâ‡úhÅÃáò^‰Ÿóð¼¸Û|ÆxôäonÑÁÏ® äâÂ#*cª*›.øu¥Þf4‘ê. uè°ìk”>}„N(Ÿþ ±ä½k`Gj ‡¯‘;¼ìîJiŒëÔ}Ü5 2ßTœ÷f¡ÊŸRÕ‹¾¶Æ(=|2ÂÁ¶'¹W-Æ%BFŠ›{\ø¶ÐýQQ¡ñAÂáÞ­ú$}F)Œ(}¾Œ;L\mû ”þ?´.ª©oØÎÀÚÛ¾#ÄÁÿx(¬.’>djÈú7F™èß"Ã~ ¤CE#%8£o(Í¢oŽ3%'g§©éåZ§Ó§…üš.ŸèT 99Çåed¤ÎZHìWÖû¶·U™ÍÖ¡ü7aôÎL Õ?x%Ï®Hñk’ÆCž&'³€ð8p.tœÞ„kq4ŽÌÍ5X)ÈÊÍH™áF$ž‚×”¨q@[!‘'/ÇGïÓ•W—[ øédL¡GŸÆ\þ˜‚ý6¡t-:Nû˜^ÿSµéš,ƒ¦ Cñ›MØŒrÈØâEÆ“_i5ÙÙ?CzQɃ›(9'œø¦î{@{*áGÔ&´3‰#­ï’î”ÜÂò[(iŠÏÄí¼ ô*!XÞ±ùèrJ!fŠ uþC¾qAæ÷µ•Š2ËjjÆ•¡ä{Œ# P È2Ì$ÛÈjt& q×c`ìÂ~Š}¹yØÇ§C‚&K¤lJÊxÛzŒus¯#¯ãLt£J<ßÄ8ß%Ù;>yÞê°Ì–Å¢›ŸOÚìµ=.8·5÷Q‚’K÷o¶Ø»©MQg³ð=Äó3WP¬¨àéÕsî·ì,ÈAÅ÷nãÀßEÜõ#éLååzŠ»Çèþ¡¤ÍR<„îü‡ÄìÎöñÏñÿ s1¦ž¡&É‘ûXv_*†âÇ<\ÓÜúÄçëuë` ,ˆò™²$k,€†Éïvͺ“p~ ·ÚÿÜt-ÿ¸Ë%ù= neqh—zîÓ{ëuø´ä¼ñ««•­p®ÄVM+ÞïÁ*z}›ºv‘-J¤l‹©ÝöcXq~Œì,a-o öŸm´`Ê··¿Ua?˜aþ2ßÊRendstream endobj 49 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2522 >> stream xœVkPS×>1s@¤­Þ£ 5 ­XQ@™K±UKQ,¥-X|$‘7‘w€$‹ ¼åýTb ±E‹T*ªíŶ8©^o½vZûP¯®ƒÛwjë´½3;{ò8É:{µ¾o}ß163‘HÄú¿î¹Òúu±°@$<;CX(²ã¡ëdˆ-8ˆÁÁæÄ³OÏÆ#Ï ö)Üö4#‰’Òu~IÉY©š˜X­|IäR¹§·›|¥‡‡Ü7Aª‰T&ʃ•ÚXu‚RK/âå¡I‘µ6K¾äåX­6yµ»{ffæ eBÚŠ¤Ô˜µKÝä™m¬|«:Mš¡Ž’û'%j囕 jùôÓ­˜þðKJHNתSåÁIQêÔD†aœ}“ü’Sµé™JUV¤::$&v«&.>aõ óó:Â,b¶0¡Ì›Ì[L8ó*ãǼͬgü™Æ“ÙÈ2«˜ æ5&˜ÙÌ,`8f>ícÃä3ß‹6ˆÎÍxqFåŒ ñ2ñ¸Í&›[Û‰D%ù€Õ±w¹jîš]Ž]¿}ˆ½Áþœ wœ¼ ô°A­"a礯k6HƒT0”è²HÙ£Nºl0$éSõ¥\–BrÈô1tÃaø: 8A¡lPÌ‚`UsèùØþ¸³€Rø¡áË¡Ñ —ª9—g)’õ¦Âj¨®L2ÚDò–]ͼ>Ñ=ÚÇ Z¾C–ñþø†¤+ýdêÇÀáÂÿÄÅ(]ñ Yž);Ãß_ûú¨êMóøã§FOwq,„8W¿ðM EûP¼ÌQØ5Û½{w‘c¦óæJ\…vÒœ|Ý^ÈâTæ½]]æ¦á°#/kü•9I±„¼ø{$/Ó|Ýp:§`ò¢0R˜X ®kÝ¡µÌcŒàÊã" Y„¡J‰qIÄ’%zn÷Òú\Õ~1qrtB:¢ cã_‡Ï:(¶ÅfþTx_ØÌ?Îή۹yÍ+¥]g¥ø=Kü{¢ö…ÏtNÀ‹´lµ}+l-l°NÈ–¢\Ò&ðÑd”0‹¯l*¯<œ…M4äB ¨€¾›h ¶ú4äÁXZ {Ž$,öÛ~d‘¤B ÂÁÛ¦¢ÆØò¢¹û Ë‹kÒ  zQ¿Žlq" ¶X㵆ðK<.ôLeÖ~];8×Rä«Zïc³Ó}ÒXn½tn‡òŠÊfÎQ°›Qu½Ì¢c´|•u¢x†¿õê'Ä%”Ø—x+{³ínëoÑ5ï­•š«;¡¸ ¨}d‘,YIVí"bä2Ç¿:=x²U ŠŸ¥Ã’¶*ho+„ÙkeÐò˽³âÞV™ßÿ72=?ø¥ëóÍøæ0eÖZ95Ä?I²ŸÙ¦–¦–ÆÖá·Îæ¿KI)½ ]qáò›daÈö=q*ÙþSgšéO™¸¶¦EËâ#¶ÄADŸÊi§5Þ$ÛÍÂE‹¨ÝZ]‘ð_Q¿¿ê‚ ¡”b‘Lû¼u²!ÈÕë‹z±#Èßð¨íY+‰)SaX ~äZ’—“X’眱3ΔBäW˜ÊŽÖA?gNkKˆOËÐl?©üøê‡'[¥Ž‚žÒ”Î[?U“´ ±hÇ×åCA¶Ñ˜W"ÕíIÞèqt{o¬ çá¼Ê1C‰Ñh4ez}î>Hå”ÇövµõºJØŠ7‰ÿ*&,yö;w|={«¤IjŠû0´×N«Vá-±Ž)|GtÕ]Þ1$S†ÜBÓxüÝ•Ì&ò»¸ —½w¿©agõ¹Å²” ÀŒájÄ£²nÓ@Ù‰¶¾–ÞwÚ-ðª‰CÙ6ο§ðЂiTˆmï}cèëÌI,dæ]ɽO͵&£¡Bº¯ p/dp‘½Y‡ÚûNÄ ®÷ b5᤮¾Š òðÏ'z²šîÞÐ#.Â98„.bìÆs<®•àKß^¿‹ŒÛuâ#{䦸ÿè¶‹BÒmz}t=€î©=\Xœ/ÜæÑ|Á›¸Ëˆ G$TÑÉŽ^\yër/æõ\Å´ûWÅ8ƒøS)£Ð`%ØÙ¯. 'öåÕȺ;÷7™ô%ÔÅr¹Œú=‡Õ·´ufõ*ªŒ¬ ©ª3ª:œöIúÆÚ ñ5ªAlX:ÚŠŽè¶ì´â`-låB.nÄ×põµ/ÿkKwj4¢s¬¢N¹ JÊ•yýt”ªÊjr8³‚÷‚ñ÷߇ñ7ÀÇð÷’’þËK¹a±±[¨˜:ÅŒö_8 ²Çhœ?±ÁÅo¯O°Šç’''éÜÿmƒ“_ç™3,xÜŒ}–ÙSxô£Ë¼9û„Cø-µÃ>óð!÷Ós×H°ô‘í¯€Ü›ä?ÁãìœÓ8Sò.ôæµ§ÕЃÁFºTÚ3±WíÀÝ©»YßTTž»Ç¨Ë5ÊJ¶Åg$Á&Ð}Vt‹›³¯xD7A3ŽVžØaݽË}BÞ0z‘—dŽx‘òEþYÙ(Æ´I1?°»'J¯Q«{4'Ì=R²žRI{ÂJÆé‘ä\ø…xÁÂ2j&7§‰aÕ$1^G3³ïÔÕÔVƒ³…M1dB4¤@(h§å¢®S_TZ\j0ÈHYl+(Ø?6Ýšæ0ŒÿÚôùlc]ÃÁöfœE<œ*‹¨ö¹‚LÈ‘*ØNÓ§4têapú ” ™_–S^Zž_ÏM*Üž®2áwZ9ìó©dŸÿßÃ5O˜vM¿Ä“×)[nE!6‹·ÄeK³¯4l‚eœÁýå”èÊ™óÇÛÓ×üêü…ÖZå”…î.㛂.jw¼JeŽ?1 ݈Í~£7¢Ð†¾S7zY-ÿoX³;8tga‘Ñ¥\a]AEýkèüé»’wGÅtÅ u77TUIóê„jÜÕZS'!;*Y‹=ŠfJím¼[ìŽU;8 ¨ÃaV™ƒ#Ãü·ûó¼endstream endobj 50 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2204 >> stream xœ¥V{PSw¾!{a1*1Ô½‰vQ¬Šøh­®­ÖçÔŠDEM•‘P„hH€ˆ"Š@’“ŒÈCQ¢`ÐDA¼>jÕêZÛµŽÚqgwtq×vÆÑÁºçâN÷&ên;Ýÿv~3ɽw¾œ{Î÷óˆ¨à J$Ñsãç$MŠó_Žæ‡‹øAüïÅ@T/½}ËB \ áÁí#BŽÀšÁ¨ˆkQb‘HgÜ=W·Ù¤ÏH×”1©c•“¦OŸ6^99.nºò£,>#U­ŒW´š,µA¸Ù¤\¡KÍÐLʘ™ZƒaóŒ‰óòòbÕY9±:}ú‡cÇ+ó2 Ze‚&G£ÏÕ¤)è² Ê%ê,òUv±¯¾æê²6 ½2^—¦ÑgS5$[§Ï1ä©?1¥Æ§i6j26ÍØAQK©eÔ *‘ZI%Qs¨ñÔZjKͧP ©©)Ô"*žNSr*˜Ê£nЦ‰E]¯¿ .¾b y.QIÎÒcè[ÌhfSÉ|Û¥}À᳋éÞ”'%CeÝÂ/'רèfÛU{´ÃK³õ\øÛÜÔÐ(zpö«®ÜY,iüŸjúÇ•ícÆ­JHÚÂÊî!E“ÙÅ!*ZÖ}Í i )ÿmI/óŠZq:qˆ˜oÇl9›øŒL#ïÇE“(2èïcð8óá3È’½d±œÈ©‡Ýp¾î„âÐIŸë,øÀWРue@"¬c¦¡ˆŒ•òYB15øvâňH½@©¿– øHŽ!4™áÏ!A 2­Û~Úà:xÍþ´§â\ZvïfJŸ²V«©²™”Ö¼––VWÇ…•-«YY÷|H]cXÌHù5%^~xkD›O} wC…"Ó‘“ot.ª޹öÝiËN¬`mÛl¥.`CE£â>}*MeÈOc·Ôh÷¤“Eb M­ß\¿UÑ¡m+¹·‘õxKî.6{"Gn¹Ýµƒ-­-…íÀä@‰AADt>ì:è´Ã~kƒ†ýûéÌÏ¡7ÆŽîÊóh›²{i-™{>¨2]QÒ?s8«^Ô+hƉ{ù‘rr”V>4ÞºÛ}ù6{A•D/ÌÌÑ-‡ë,¶àhŽŒÆ*Ú:fmLŒ™I§¥}·Ê\ü NÔÔç÷ùpyEMùÞ+Àp´Á’eÍÍ ²mƒ*ºò¬µÈl.±š£H%‘àñKœ$ÓºÚ’jPÛ ¨+´k XÀ e~äL’9 «üÀKŠ56Á{Æk Nèsn-ßÙQMP¾ÏY÷«#_ê_=ª¼TâÍâpé1œàhÅÐq0Nõ÷q.vO¾ >}Ξ‘ÔWÃáÆB(T,±A 42˜I÷ÌûšŒM Ò²)<ùGÝ­.ß±ü:³mÞÓj«æŽG=K‘A˸yfâÜE¢‡ÃA¦¬,÷>p >f+N’§ÇM,Ô'¥zN!…“kÏ9XéË(àøN„cp”˜7ñÓå¸U }p ¢ê8Iª9JAs!Ý`­FЯ©ô@Ù[¥¹_B®Eâm¤8Zc É š©þB©è6ÇèÎh ô-¡p#ýô¯˜BW”€ÅQe*Î-0*ºÓñº¡nÀÉ4›^æòÊz‰ÊËɉóAUg­ÃyݯjŽ ªô°ÞžûJU{7ì°–í´Z„&V"ÃÆ/8Ég–IV+èXJvÆ¥ý# ëŒë2΃¨í`±;*ËkÁÃÏ9œ¡ËÎOKâR®ÞûòÚå£Â¤î<``‡¨Mð€98XŒýü8¹©À’ »˜7j< ÌžådáGÂkõýxŒÅ÷Ž!ã¬Ý;MVKa)»eñºü$`ˆpÌéK€o¡ÜSg6×(¤/ï¾V!æÿ“ŸïÂH9ÙÍ)j*#D½ŸÐ«0Z­:sŽÙ"”ÂèU’6ÇeÁÊ|ð9t(ÓÓ&Øj3Ù³VaÞž³ÑØÔÿ¤2¯º´ ¢êaïþòJlåI¤- ŽÄëx Âùþµ«ŠïÔ$[h#A‘ž ×ß­¼Ø‹Ë/FøË¯ð·ê6þ½.ùZ?ÙÂÑñ»¡]ÁÿH“ùÿµ¬Õ´ìlûšÕ{>NFšBF’ÈŽÇ…lÛŸàÌawƒ_]hJIœ%"pó |q¤]Ñâãö¹á2td6d ÂañqœñÊ~‹ó)‚û6샣î’ÛkÎ)6zW\ D˜:õd0öô|'w½¨;˜¥[-¥%ŠÜu ™‹ÄH+FW¶·Û|®ãG::ª[CÁN†Ú´ŒŸ VÜËáf¯C‘êÁb å—Ég«îÞ*Éoí·iŽ xFcÐÝÊ¦Š °8ÙmEÅùÏ${òkuuúÒ»?K(5 a{뉢7‹KŒN.„þvVÒòT‹?ü’zi_o‘Wϡۋn.Bë¸ ßQℜ*+@/þ$G7†Ñø®ýƒ%+à}2]ãråÈ;ÿ5|Ã<#A#ËØþAo&Xè‘'þõ%Lð›A7-;‡¡’Z8îŒV-äÃøÖÞÌ8e¼VÖ Ì¿jhÚ>׺³Ðª(Ue³`)ìºUê³Tß°Vl¿™èNæ¿ lóŒ‹øãHRCeÑÀ¯’“9þ‚®ügý¹mgí~K:oñˆ§eÏöñ–ŸJ?¡NÖj““=Ú.Ÿ÷Ä)6“ïhf£¡o‘üäôŸbµÚÎØý–tÚrâ›´ÿG‡‘'ú Ɖq'$ïÒz’ßDîòxºXÒü›gŸžÃha]E‡Ñb´õɻӛÓ×ë6j5n­¯í„»“Åœ·Ú6yÔšŒM)ë½:owóI+-ªâ—Uâz×¾* ùÔIsa(ù<­><´ÃŽ’æð¶p)Eý?né9endstream endobj 51 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 441 >> stream xœcd`ab`ddduö ²1T~H3þaú!ËÜÝý£ð§.k7s7ËÚŠBߣ¿‡ò``fdÌ-lpÎ/¨,ÊLÏ(QÐHÖT0´´4×Q020°TpÌM-ÊLNÌSðM,ÉHÍM,rr‚ó“3SK*4l2JJ ¬ôõËËËõs‹õò‹Òí4uÊ3K2‚R‹S‹ÊRSÜòóJüsS@.ÓÎù¹¥%©E ¾ù)©Ey L†F B  ±øüÑÁ÷cy÷š«×lŸÏø½þó÷s?E—uöÈ%%‡ëtsd±/ë>Ø}tÇŸ©ìiõ:rYl[úvïÂGÝ[:öò(¯É`×阾AdÔÝï]ÃxàË÷’WÌß×}O=këšÙ3O9v¨ûÇwnõ¿óØEmj™¹`Õ¬û#»ëåV\9·dO7Ç‹Ý6æÊNö¿¹~óÊÿú-VßÐÝÙ]$ùCžmÅwwÖ¶ŽòæÈúŠÖfûîênŽßnl|e ~8Ïúž?uò¶ß‰ÓØ×p]ç–ãb1ŸÏù|ÏõÙ<¼ ‡¬gendstream endobj 52 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 302 >> stream xœcd`ab`dddsöõõ´±TH3þaú!ËÜý;ô{öwfÖnæn–•ßç }üÁÿ=T€™‘1¯¸É9¿ ²(3=£DA#YSÁÐÒÒ\GÁÈÀÀRÁ17µ(391OÁ7±$#57±ÈÉQÎOÎL-©TаÉ())°Ò×///×KÌ-ÖË/J·ÓÔQ(Ï,ÉPJ-N-*KMQpËÏ+QðKÌMU»ML:çç”–¤)øæ§¤å1000Z30ð2012²Øýèàû¾ûwØ‚ïŽß™¿û/gþî?K´Û«6È×·½£³³»£yrë¤é÷n}ç<]¼=>£<¿ ^þ†Å³föÈñ•-øáçò~"Íh¾endstream endobj 53 0 obj << /Filter /FlateDecode /Length 161 >> stream xœ]O1ƒ0 Üó ÿ @ÕvA,ta ªÚ~ 8Ê€…0ô÷%:t8K结ϲínÛò¾(‚±¬Ín H0ÐhY”h‹qgy⤼m¯üûã V™ßÕDòy¾æM¹eÐiš½B ŠGuQ4µ1 ÖÒÌî<™&£ªð’ý‡’¢©Ãqp 8梹H*`™~¿xçS Vˆ/$™S™endstream endobj 54 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 395 >> stream xœcd`ab`dddsöõõ4±T~H3þaú!ËÜÝýãüÖnæn–•ß¿ }üÃÿ=R€…‘1¯¸©Í9¿ ²(3=£DA#YSÁÐÒÒ\GÁÈÀÀRÁ17µ(391OÁ7±$#57±ÈÉQÎOÎL-©TаÉ())°Ò×///×KÌ-ÖË/J·ÓÔQ(Ï,ÉPJ-N-*KMQpËÏ+QðKÌMU»ML:çç”–¤)øæ§¤å—$1000Ú30v1012²LþÑÁ÷ShꂾóÏýèaþ~⻦hoïÄI}ÝýÝǼ¦4Î/_º lB{_ûÄnŽÉ“&Mž˜r¡n±|ÁÎîÞʵßmnIÌœ4aB÷$Ž SëšÕÊÛ«å\êJ¾ûtÎìœ^×-YÛÝYÝÕXòÛGâwÄÖºŽÆ¶–‰­ÓÚä¿ÛYWfvwÆJVædøv·r4Oj™Üßß3mª_Ù‚ÎS§Mû^°€íwÂTöu\¸å¸XÌçóp®ëçáa`– endstream endobj 55 0 obj << /Filter /FlateDecode /Length 523 >> stream xœ]”=nÛ@„{ž‚7ÐR|ûž Û8‹A’ ðgi°0EÐr‘Ûgf¥H1ÆZÙß7òêôòúåu[oíéûq~Ö[»¬Û|Ôëç1Õv¬oëÖtçv^§Ûߦçô>ìÍéåë°ÿú½×êrï߆÷zúáI?éîï™®sý؇©ÃöV›KJå²,¥©ÛüßKùéþŽqyвŒ©+Í¥;%%O¬}QR õŒW”ÔͬQîIÝ3ëSQRÂõ¹(¨z„AX碠êWÕ¢ VÔLJ=1ú®(¨„ìÐ OT+ *! M‡‡ M‡‡ 6&#> stream xœµY TSgÚ¾1’{U¤JzkÐÎ Z[—ªwªÖªu«»(u¡Ê"‚ì"‚,a YÞ$l²/!°Dp¡*ZµZ­­Zµ.­VG[ÿÖÚÖj¿‹3ÿÿ%ëœ33=gÎüpNI¾å]ž÷yŸ÷" úö¡hþò5m½Áð¯öáÿ"lx¦ìJsg!8÷Ýóê_|\yz0Ê} y¢„ADLÚüȨxÙö àX÷ÑcÜ=<=§sŸ4q¢§ûÜð@Ùö¿÷å~±Áá~±äM˜»WdÀöÀØx÷ѳ‚cc£Þ~ë­¸¸¸ ~á1"eAïŒç·=6Ø}M`L lGàV÷…‘±î+üÂÝíÆM°¿Î ’ÇÊÜ—Gn ”EPõö܈y‘ó£6FËÆ,Š],_²#Îo§ÿ²ø€å[Wn[¼f»×ÚÐuaÞáxLš2ÂU<ÊgôçqãwM˜HQ#¨•ÔkÔ*j$µššI­¡¼¨QÔZj4µŽCySc©¨õÔ‹œðu',¹ð`åÚå&WÔç ¼0D|õAY\IoVÀbrP“,äî=Ž»+à -£»tâÜÙ‚uk8œô/×~2ÐÖ3È‹†;` kN* 1®†yà㹜_{Bãá §0Z|ðb^ÆF©K×z•ó&ÔjuEÒ[èÔÃy?óHÆ÷a‘–nÔçvphèaÓ4不c¡ô»4öaÅ…sp…¹ûÖ7ø®»OXµèš^$í®¦ÅO‚4Šw¸˜0þUr»ïîz^ÅÂBér|ƒÅƒE>šÜF)² Uô£ö ‹ßûÀs¤Ô…W+ÌüD“ öª¿%äCQ‹^õăÇbŒÙßÞDýÐÀ_~BbGcÖ¶TF’€3Ð ­p¼ú@Í¡ŽÊ}pöË-¾_X ëä[ä›·DlÆ¥k›ÜÚ5Þêzâ1Ú$3?8~`qš†=Ð 4ý'$EL>ä&+@™ªåÒñkîžXÌ ¼~:*ÿ‚:Ñ{Î Á½‰ø #§Ou10¥`¨”¢Tº r*¤¤sænk^äMp?À+ñT<û;±·3ñní2³ëÓ ¨ôÖñCô.ïÌž§ñH[..å*·HÅ_w÷&u®So8ªiz³èÝtö®öu_ƒüöb‘xì#ÜW*~8ü¶ÄÉ.aQ ]wôpÝQ`.Ÿ™ŒðÀÓçÛ¢¤I• #ãÂ#ØÃÿÝ*¸`æ—›…ü®WÙÜòU.Sª„8®{­HåNfQ.rªÿÍ —yˆºÝºq†´î– •ï'*CF'™(KwŽÇËÁ3´«{|kŽ3ºî¹…J º¿æañ¢ïRNNt?¬Mö?;sfFŒÅ¯àÁß@ ‰ÌEhÛoªc (ŒÅÃi”Ç$'…Fù3oÅ=D£o]¹Ù>Å›„{Xou==ÿôÎñ54}Ë¢>4–ÚBm½øàµÖªëÐ×Â>è€}j›9;蹚‚f)š@0zï«\=hõœZ—ÑLde¢©Ü\ØÐVçˉ¯Íƒ ÅI¾]:¬èÐzõZkF¯‘¨ÞèšÅvz^•tOeˆš × jÛà;h¶_Bƒ¢&)ÒÞ¡Ì&5£r™hzjÈ›ÜT”#r ³³W)æ3‰2§0ñÓ*\ͲP¼9ö£!â{h+òfMªovÁ|f}pÀìéA'¿ÝÉ©‹´Y©À$CF¼KèÈ(ÈÖé**8½ôåüj+IzéCŸy,¼>¥PÒ°5Ï/ЄWÁâ¢SC›,mwPŸl0=§KÛ z`Š »Bú‹ó™HIæÔªÔ4•:°Ö \{—FÖÈ¥â{ ѵÊ/“H|Ìrkšɬüëöœv/¸iˆ8‘¿–-’ï (f7ä•HÑ<º5+û3ÎJoÓ®Õ„CLƒ ‰PX}ß Ø&]J‹;p_,N‹|olBGIQnh<ýûwxÔ¿­ÉІuÇGƒ^§áIØû¡)x2Z#'^†›–=Ÿ‚(Ìh”EZÑ £à· h¨Yˆæò#Yôš¿†–ÉDZÏp÷1*Fþ-®£ñKRš/Õ^:Ç”­¥I»ß¶¾+ãýåS+Úcµã óžïâe›õ׸j«(X=—ðR ¼ Áv¯ªi;2p2îDÉôŸ¬"Üú~®.³®B“?1ô;vÀ– N\òg«)LòvR Ï›ÏN~Ø ÖƒF# œ¬ô‚ôÜä<¢ñ¨çå‚ÒS6-š7]ÕÑÉ¡o{¾¹êIR<–ž Ñ8N¼ó¨­û”qAk—À!’Ûü7Üà,6Ïf¿¶Â¬Ï,ô CgjÅ,.Úfó bq+Üè±9šž¥¶Û\­¨ä‡Z|’Ÿ‚î°»«ÊöŸ×1V:V¡…øPŸ ³I·h ba'¤iT*Åë8O‚û¢e®ÞÍÒ å\áZ/M,DA€.\oßr²”Eah$F’œ$}fAÖî¬|[×p\[n ÿ‹î±åG¬EM¶kåäZ9DÀfýNǵÍZSº(G¸.‚NÛ±òf%ãñ€M«Wiv€[mÑ[u¨ƒvMµ£ùÈ EP¦ºÆ3_~5J’§(ÚEÒ˜––eõºzéU­Úz»¢£×A¼>¶Ž±—AÇk&´­½·§'’ž>E{šº½tº˜i.¯¸¦ƒŽ-ißpeXoçó‹Í_Ÿ]ñ¤s—²ÈŸ† Д¶žø8¯Bstu Åß°üa›feÄæa!ë`3UÇ´fn€r‚R'Â:Fžs°Î·¶Öƒ X™HñzQOï‘ :t_Oïâ¸F«(H=‘¹fÿ+’áËí½ÜÏT~›—“»-ä'“°œ=ª+…çu>z¹#?VmiÑ©ZMfÊX+ÁBdRåk²ž--PÁ9”ðbÝ}D|-Fc»’Ìä¤e²|mäÂ¥ ¤€Ë­Yy&(e,;KcãäÉá›ÛƒŽœm;y²š@gáêÆï[Ì6yñÁ÷If›Zí‡"X4ý›öc»Ïjƒš8µ2’™èò¸Z‹±¬þ‹9­ïàÁoa âÄOðËF# m@Îùù© &\¡ÔpÞOÙŒ˜÷ž¼M•º<ÝCcîµ|õ×B¤ìæ™ÔÄ8Ï~ÞÕÕtøŒ´«ðÃúFh„ý¢f$tÔHùf”드MðêV†¼¬¤í(Ñu_õRu‹á Bz­ð9´¼HÕ|uoSÀ³EÑÚŒxÙ}ZÒKánvìõh¬D~ÐÇìúƒÄ󿽈DFG4ûZÖûûƒY,þi4²ðÜcn`Pe_ìG“œj á›6Ë}m8³ÄìnSŸ$j¥Eºî`¥uoãqh‚öDëæ‚Ð@¶%ü#8ͤ˲šr;Ï$@}ÏWˆæóóYÄÐý裆È(áRTñÉ cbKãjêJŒÕ-Û½LóÎazVØ |íÏèU$²Ò.]³H}ïµ ³$ÄÜ=ÔñXˆâÐÍ!gD}ýóO£ÿŠÿ"ÅO_˜ÂþD¨Q‹ª£Ý=š Ã7ú)ŽÉ¶a ûW¡5§nW!¨r­íŒ»Šæ]mêÜrjˆøw’¡wÙ)ðsU®¡Ä,Í+¬ªÝÌ]¥ M”IÓSb#HÖ™­,dAU™±5²M]̃ ®µìj‘UI›÷4g—Þ΃V¡ÊT@ “P”Rš_‘[U–Ò°5n‹Òßókô3È™°pá;[LæÒäÄøfÄ]„ZãV&„úB3ÿÑZä‚úÿvôzSÒÑõµœwíjXA8È2t¡Y;¬@0=_`ßXxôØ¡½- ÒODwP_˜ºî½ c¤Ž)Ü^C‡¢>_±ÿøtز2!A_,J—®X¹‰ä÷˜ u’ù›»ƒ´ÈiÎã-CÄÏP,zÊ¢Bª ÐdÈ×טû¨¯ ¿¾0æmu½útÁy2W£ü »Ûül·’°Ž©7L ºãújÂM½aZ¢Ên%£u¿—mUF†É£¢£LÑÖZseaùN2±O¬u=a‰>‡¾8çMrýÊKXü²uyÉÖãpÊíâñ3×ÑLž±9‡Ó)AYÐ3œ íê?C«MÉà‚ׄ×ù·M"ê_8}òðÇæ]’¨Ž¦\L`Äj2ê3j·UFç:aÞÛ0zÄœìÃÞÜêãêsÚfm~:¨{G'û蔫Óär 3Y·Ÿ ºGF§~7B}¤âËðó’o¦m¢‘„ijÍm4›QÞ=”gvMèòd»‘h§}ª.FSKÑ›PN0“¯©Tb’°í4‚ µ~…Cä÷1´Ù@€â=¶v@P\žU@ÐV䀒b<Õ>:ÔŠn<=/|úÅ„Xê öi÷iþ@ñcúÜÇ׆·{A¼ÛÎÕN²®V÷‰¾’ˆ¢:mcÝ6Cà1,F‹$Z}fY—Nçç=Ú®¯´‰­u2DB,×'9(¸B›¯€dˆKJIÏÀñ‹„ýG˜§‘tq(”.«M¡ìbñˆ±3Çùàþf´†ãÿé4ÆÃƒÉˆ¾ÿ‰Ê8ƒvÃ>]¦á ­3i7i¶C0lÒ½Ðì(í2ž¢]ï³/ê³2úy°ŽéÍ`& ©å…’·Y^Ù5œH ®MÂ.ÿ [ÜRS÷…-aš»F]­vÜÖ©­Œ&ú ]­Ô(ñÒîìÅë•Åöá£î$˜mª×6o¯…ŸÙDP Jì~&ÉÝ™­.‚2Ðgg]ùLJ„öQíðó9á‹Ò’îÎ-Øüüùâ×ÏŸ/v¤þY¡#€åÏb„φ“–ŸÜŸßj‘áš0-™ˆ`io?×CÈð¦T§“Žíö—à)|²6K“Cæ¨úS`±p‘¾zÇž“P …A¦,íž‹§ò ­hÿ\²2 ·!Ÿî.‰!ÍZ$?¹YEȓϖ ·»sº9>µÍQ$ -ÖFŠº"D]/³Õ å–/ ¡@&#|¦›LÞê.ÔÖuï’f¾îötÝPÚC]Ðbë­p =yò‹ÕõÈ´å;‡8_cŸ>Fwú8üì†D7± všûÖ$¯#`(k*l³Ä[‚Ó5 UsUŸo9Ìwûßöœ¹aÖÚåR¼‡(D…Ÿ‰Ÿð´¨Ís’‰2Ã3¶¤&f¤/!5ì° µò~ÄŽkÄäÉN±õ†¹ÜÕtþo‡c=TÓ£<îþlÅo"®åìJSÛž¡àÓÝÛIJ‘ÙÊbµ©ù~Näd^Z¹uêÚˆœå¦+¶—!â¿£ñüötÌAßàø¨è貨fcq~ah½N§FIªÐŒùË–KSRˆåj&#[•]pë+ÔŸCÞ¯ü'Ûl†ä¢U‚ßÑ !ªåsÙò2ìŒ&¨³l“œ[<ùIÉMÍO—ö®Cþd!? Ë™Ý›W…Ly|y|¢B¡TqØ/‹w"„ñܵ;¯xäÿze»–{:uÆ]Ñ8“9_±½Øeæ½XKBMP\RªRÉi5Z­ g5ä~yöSi¡íq€ÉÍÌÊT̘ƒû¯¬Þ¼¿©¼Æb Բͅ—`Cå3/£àÑ)!º3XÂëú„2<¹†¢Õ€Æš·ÍC/¡ÁE=‡¨ ÊTEX¼Š[û¤`!)ùÙxàÇØé4~éÎûùÀädr¥v‘³Û‘…ë 4p-rZ‰^šúY*0J•J©ME¼ô§Ñ'ñdÀ€çlÃïáAØ5Ù4e–*'ÿþHü wõ)DB¸Íôü³Ä¶Ñ÷šmÏtѲïß'JãºÅdå&ûKqÕ¿çp^Hc×´]Z[ ÜÄ·´ $ Ãý‘“èÑ}ŸÖ7§Æ92v1!–䊪ªÒúOÖ¶Ï€¬Ç‹þA¬ÿó+Ð5𠝳£¦’ ¦Ÿ5[t치¶€^Дæäåsz½“N§MZ¹b‹T©$V©ì€)¼qÑœ ºƒVž r!ªC+ÙS¸|5mÔˆ À«„¼ 屦n•Üv#<Üy*Dk±u1Õ11Õ1uuÕÕu6àÉM]“ õÊ»%ä}ÑenfÞ ¾òឥ~°æEûO]˜9f»Ymsö¿}9î0‡¯*üÐp!û:Ü`p¾Ìn…Uæø§á{Âuçà|Þñ 4àên3™ÞÎÇWŒÎ÷‚9°ŒôëEŠ¥‰ãÖ„o&´#7ñóËPDAŽI„ý ikÿ ¸þ}§û™v;;_0:¤¨ÿlŸ^xendstream endobj 57 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4182 >> stream xœ­XyXSgº?1Õ2UŒš±÷´«­Új;mµ«µÖÖVÑŠ V‘UˆB€@HHHB–7{ÈBX’È&D\±‹K«vlmÕVÛ™®sgkë|‰‡çÎýÜ[»Ü{Û¹óä@røÎo}ßÃ"Æ#X,Ö„k_ZüPôǹáY¬ðÝãÂÿÆ3©·‘”˜Ì†Éã[ïæþÇTt| *ûJº‹`³XÂBÍ ¡¨DÌÏÊ–ÄÏKŸ¿xéÒÇÄ/yè¡¥ñËs3ÅüôÔ¼ø5©’ìÌÜT þ%'~ƒ0Ÿ))‰Ÿ÷d¶D"ZöàƒÅÅÅ‹Rs  ÅYOÏ__Ì—dÇ¿šY).Ê̈A˜'‰_›š›?zºE£o+„¹¢BI¦8~0#SœGÄìåyB‘ø…‚U’ÂâÔ´WJÒ×d¬Íܹ.+ûU~âÆœÜew.$ˆ9D±ŽXOl î#‰yÄFb±…xŽXA,$¶Ï‹ˆ•ÄƒÄ Ä*b1ñ"ññ0±šø-ñ(±†XKÌ"òˆXbFŠOYX­ãvŒ»Ênßø?Ƥp&qÎOÈŸð&>51pGé¤%“þ}râä¯î”ÅÞûίºîZ9åŽ)=S7+nÇ´ÄiÖÇFdB[Cáý¬S‘;Ù(ÅpSžIÑe”Fc)I½©ÂM5ÂK„ Mß G'ßcóB½[ j­5e™ñçU6OUíïÐÔ™HÊq3ËbŠ ÊS”å -÷€…ê‚K7ì…N}GôËvÔyÕ Û¬w6è”Ç4ZdÀ“N£U’9 ›»›¹Ãdrbç”Áð e ¡5ClTŠVpmA{ÀôSížê†¾÷.yМ\´f3IžN+øú ("w´dþ¢Í·¹Ô Q€¡LG©E¢ùë,2úª]MÎÚ?°‡AòÃÄàÖ¥¯%H”æ¿5² X"Ë•¦+ÖT¹Àæ5™‚6ªîbý‘M§”é¥:ý,3`Ð+AÏS:ËüžZG½ƒŠ ;ÇN<î"ò\d‡í(ÄýjÝ…G˜».3‡™{ï™5¡»ÍA÷QŒñs3v†~w´ ±ÛNÐ]C‡[÷y¤eǺ”Â{ t^â–ä­@â«2›BhÁȕà o³?e¦qÕ9j}†‘¬À(kl•ºSÔmС Œ)ò¨@¾ì.»£ÉZCw¢¹ŽÒÆ´ãÀC,4 ÍCóÿžp$akJ?.LöˆÆkA¦Ò§$\gÇé+¯ÙçzU*b&å½L—‹SVnr½ê†Ób²˜tlx©2€.\ñá3Ï¿ÎFn´Ÿk²ô!îÇ`ƒð˳•zT’Š*iS]¨zßñÕî]/d%Ê(å@Fý®’‡Vǧ™ŠÄcY ¡þVäé.6º€>à~Ä9WU&*ÕÉð— £ôd¹¬n‹©ÞF½ŽD&«É6ž»ô £¾¤’*y^&~ȧ8g‘ÇÙî0µcè&rþÌy¡@/ÕKh£,&zj“µÎLíF+-MZ(ÞðkœR”(àu…4º2šùõp»š¯U¯ÂBWbc¸ÁB÷@¯¥úá¾/JY•SV2ZÅyœ^+˜­>Œâeð«hÑù£Á©—ohN¢©ol»4#î”Ä=¨êSÁFR zâÞÂõ¶c2ê˜ zÁLÖ+¼EaiòÚÁ¬wÐýÝ(¶ÿ“§êÒª¨¸›B{–óÀ¯ç¯6w©2Ü”@§ŠTÚKj›<úÓö½ÄLL{`3w ž>'oÑ’±‘êÂ’‡Â¿ ±ÐýŸ°#/¢L®}·ÙuH¯êœ:[|Lf $[R¢·¢V@±Ò >ÚÉñB­Ñk èFƒ jaáƒ2W˜’‘Xž ä‚¥o!Þ`zøbÓç?ÿ¼ÿ} ov>ðH~¥ôt”vÌO­•B:̬<³Ñ©2T‚²‚zeyÊ…õ5IÀcÒSÈ”3¿ýf6šóù¥þ®=tUA0Ë 0Û-n2ÝÀ¾ä…Ð ?Öþ›lä ß˽Á©u!þ§ ͳVƒó(µ©Äª"ÌÃ1rJ£tUA }•³‚é1êt2ó’ÚÓÿõØXÀ”ƒ±DM•¼–þì«@Š ±Æ5ŽL]ûX<8„±Ã®ð,®ÙŽEf!Ýj_q®&Om žcú*KÀP¡àI…y¹;€L®8Ø>ÔþiãyÚ°UC=ytW(eQ63O;jsµ•r†š¿ÒíÖç¨Dò :eþrØL>2˜wb £µµªÛx@[]hô…êº=ƒX#G5 µ”|ƒô>ùÐ\=vÔÈ‚±£.B‹†à;|z’«‹@N*sß´Þõžhz7ô!娷ù~æ±’˜»!DÀwò› Ú„}úZœP{½­Ç|;{D§àMèÝßúNëù}h {ËCy±D¢phìª!ß"ÀnJÌ)M+Ü,HÛd’lo•©Á}îEOÚƒ®¬†(yr4{gù Á©ˆ8žš÷>úÛ)®{kWÑÞŸÄyÔx›~¥‘Šë; Ôf1læf3÷Ñþ•ïÑqïwÂÁ@Ïòrp·1ëÕ‚5Ë·M}ªõhM¬ë¥‡úîÇíÔ¸9Õ`¬4h± RFPF;{YhÂHô6Œ,æF㟪JkQëUF£žš§.7* å)]P}جQéõ 0Ró†i£^•™¼ÇzW]BãÑDt?º/šâ™ü"ŸÒÇrÅ»ï¬Ú»qhG˜}þ==ÝÝ?•Ô±‘ аB¬ÓáSìðôð7ܪ½v×5 ]£¾P‚ŽN†múí©–ô¨­µ l'Ô‡š¡Tœff ÷ÜkQŸ„ŸåÁd²×^F‚™`²ºÁDzp¨–õR %X’ÂÌC@.ãä€Åa·¸LvŒL “ê¸Ú ßëW§þùFÞï䌸›(ÒÄÍd–.ß‘äkòn›Édr˜èÍÓ 5d@æ.)ÏÐnؼŸÿú7Ÿ}ýçFêOaÊd7cƒñn7Ø¡˜¸?æiÒÖÍúÿz h?„¼^r„KÔ}¥o´ëSo°Ã«Âwr“´-)sËv77»¤t½ü_Õ?ïÔK¿GÓ>ú‹Ï¦v«uF£JM-_¸DW äFqßà@ó·M‡éÎsG÷öú ¾42öÖ´Q‚Þºõ$ûÖ”p˜ëls:Ϩ™ Jif§ô ,a¾>=sCxÐ4@ÎCg„ïS5mØ#ßYžlà©•Æ’ »ÞA·B‡%µäØÐ€G3ÆTN¿j64,`·Ö ^¸e¦‰34üµ¹4>àyÁæ°»Ã#,ü13{øÌ{­ öá¯ö뻢WuD> ¯g• #¥æüÎ#^e‡Oü#¬ge!Qs*¾ÓÛ,Ùy0p¤‡þùv÷Ùèu xZûD"?2®vë„.™+¤ 7ê Ñ*”Y&bG$ákÜš³'-{L¤ÅcªëÁ]¸À·äDo½FYe¬¢œÅ8Í* ƒš7üòL&!\«­1šð¼ÀLùo¶'@mƒ^E33‡›å‰;Û)[ܰg& i+3ª‡ç“­~L®¢ zë•sUv³‘ɸ­ð¶åpý•68²ç¾—ç0÷ÌeV.>üèW?­ÕÕÊwöu»úÍ´=È=€ÿÚâ²g·ˆ?›Y »èXtŠI Ö_ KChá K|ÆÃ_+îÛ9µ®1á>Å©~×Rç»èìrtb¤¯,·R^Ådaª¦±Ñ¿÷@Úî´ùbf:_C1ãb^ŠbTŒeà£OsžžX¾F•¦-â©ùŠÍY ©EékµU7€Ÿ –¸dbqqvò¢®oö£x,,Ãã`w:bE¦ÿžÞF¸èAšŠfý M¼¾ê,♟2Íò-*o,lË>èÁòÞ÷CyGg¶j;¦[Õé€v ?æ\<–ÿrqÙüÌtvF’4Hf*ÞlR0Lž÷¿ †cƒ¸°®‹Îψû}6À-z¬VÛ0×Ñê4;ð« ê<û'X¨Õ-Ú¸‘ÎÍK’¬r.%ÈñNÖyþ¸D^yæ3…bj¶¢ëí¾ÿYçPM "8½Çe+äú ùZ¹M')¹|HpæzëM§Ã`W(Œ•åzªtC® È\}s[“¥ÁÒD[vÛBNf÷n©ÃCìè:Œxצ¢i'½žúጸ0ºŽîáÞ†RžèŒ’Znjnò¶{»è³è×ÌZ=ïõÌÆ ùÌüÊﺮª½é‹‘®«”(ó4R:÷qÅ®rüâÉ3uØodFCÚñ/ÛÑýV*î•a ·±Ø)/ Å~uµ¿¥~†|„ÂL+¢ìb‡„ÑÔN“ÓÜ µ@~³[¾o¨ªu´A ÜŒŠèÿ6[ê,T+Ze²âUÐÊ‹ŽàÔ°‹SŒ»L[²ŽY5çfô•°X­`±Pf³Éäj:„f·ÈÎnÐi4† –cpNèíV~· Êè2Ž rÌzZ*­P33ÍõÂPdÞo’ßûé\ÏŹžƒs}×ÿ’ëK˜ðLÃýÐB 7'v|´µÙ‚ô_ÂsGk›­m·Æ¬¡3!MŸéfÉøé©êáéj‚ŠÇL¾¾êK‡Øh:×LÅ"lË·—õ囿ÐS†q…UCoSçÎÃÝþæF/U»·ú,ÞE¢â©ÔB¥žÒˆKWJS…Àû® c#ƒß=ƒY;„6}ÿ1Ì0{{޼d?l)iò ôjÆû£G#=è‘Ñïð~ô¥Þú××û·­LÚ±#—R_Ø\Ÿ °uû¿à9:7‘ðæTƒX mbðûŒ¸¿"ñnP våîʯ+mêµ·RqC×ÐÜÝ2¿Ÿ#ȑԷt„ÚBx¹>R…—FÏ…WüÑ2 {“‰<Ý­£ØË¨2NZiEöL#\ÆÆŒZ±[`óHï0Ï‘«¿ÛBOsV2ÿ¨Ø®Ü®Læ©s¢íW …¦òÚ´ß¶>iÇúÐ=hN3u]ŠA…·m¯Q tC>êÿ^ˆ˜Ltë9ãûÈ·¿îØñê^ÜÖ}Ð(Í×( q†EÛÚ_ëuÙ('…y>&EPÂIÖÇÈÎFo n=6¸Åc¶Ûƒ`%G|ÎlÆ>7€NaÐVJ£œPGÅÃ+ܨÀ\ä0©î ¡;ÎO¢îÿ˜òÄ`ÕäÉñŸ?9øendstream endobj 58 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 821 >> stream xœQmLSg~/·Ü{eµ:°ÙõöÝD'~$\t³R%€ÑŠz¥Dû±Û •‚=#ÛúcK,c8¡Ä6P·t×±%ókì#KLf˜ËufjtÉäϹÍk¢•ýÒøÃœœ“s’“ç9ÏybÈ ÃpÖ² + Ÿv¯ëó}A†¾Z•ºš*Ï# FÃxêA6Ö¿Šö9X9—° ãñµz}-JC½K•rë–I+‹‹‹VH« ‹¥wܲÒPçðHeÕ%»jz8 UxëdµEÊ}Ë¥ª¾’‚‚@ ïpûó½Jýºe+¤@ƒê’¶Ë~Yi’’ÍëQ¥­·,ÍÜ–?S­^·¯Q•©Ìë”!$Ó§ìÛî&d© ›Èj²•piEÄ@Ž)f 3•Ѩw›ôïh•†‹âúÜs9¬Æy,Ð¥f–r#þØ‘10ëáïø&.Íÿƒj­ž}–¯xZÚ‘içOAÂ=§º¡£“6;&t¥w ÆárÏ™à„q±MOš‡¢g‡’ |›x—ΡRuÕÎ=†Gš-&}=h:OÓ’hb±›Ì×>ÁÌÛb0Ør=2:pîKWÒZ°¤–râÛì—èô‹±SÐW4ŒÆ1ªeã<\€nÌ{-ç°Þ„w̆¾ÿ® ÓËÿ¢ëDzÓ~ïÑí<;뻉tÜ‚Ø JFùœonrÏåÈ~ðC¼]ýÃ%ȶ_áßï…[¡½¥«óPÐÒµ' xÁ;~ìØ'änûÁ¯¨ø™y-Fÿäp>lÚhƒRºÐbJý–Öÿ8ÁÜMûYô²©^œ4_óÿBÙ»œÕ>±ùïµ}ûÁ ;j=ï Áÿ8úö³o}ÎG͆2ì”6ñiäøj‘~±ÅÎÇCç{Ç! Wz"/½Â›ÚÂzùGX3ðq˜£»ûy- É+b–¡(bœ•è7‘œ5ÎM„<|¿– endstream endobj 59 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 920 >> stream xœ•’oluÇïÖîvÃZÙІ­w:„‘àþÈ ‚‰[ 1±J@Á„¤n—®hÿп»^ËØæÖ»{®7·Ú¥LV™ÙÆÀŒ[;1þK†/$&þ{a$¾Qc¢¿ë®‰Þ¦¼r¾ðÅ/ù=É7ßçó}žÇŒŽãÕ펶#/>ÛÒ¼Z<¢nÅÕÚ µÎ±Zc®ÔV &˜Œ“+ïoFžM¨ótl#fÀñ,ßîó³·«+D7tì¤[Z[ßE?ÖÜÜJ?ãaî§—v8C]ŒÇÒ‹×èC¾7bé†=]¡ÿɦ¦h4Úèô}×Ó;wÑQw¨‹>È™@„é¤÷û¼!úy§‡¡ïá5Þû´û<þpˆ Ð_'ðbfÜï8pÃv`X ¶«ÔsaFì6>Sá0<¥òæÒ«  ‹ _ÄÕÑmËq+Óãï壃¼Ð<Éž‡Ln. Û?D‘Ôˆ$ƒl;ÏBo˜ç»íì¾X`.âsôÖÙÔ4äÁ†*?…ú˜XJ7@ »u‹¼42–²_DG… °•"/›ƒ³Ô8‘Ia´‡ÊŸX“ QdÅ‘{€ 1¼'GG©X”à|Ä/AÑTz &tŒå"\z“ LšW–@QPð•¹fÊJÒXêcÉšËéÂÄ)í9"ýb"¬ý\¾`}B=—̤ü`Ó^Zk¢“du’QÈ‹§E./Y“q1é8%Døœ.Iʉ5 ³ò \…ëüÌ*GzlÍ>Ñç‚LBuªR)wË_Ê‘7úÇÁö6 g2YµNýÉ*‰š½¼øw<Û¿óÝ€‚¬À<ùùUß7ÿñ¥ÂD/O i.½«/+} ¼´ÕÔè j"P+Ú„0ýݯU]ÞMi®“§¾¼üŸ“-ÀM¹ú|ùâúõT_¬ ô o_ß6–Ûæ~™êå\Ì£@jU„¹ôKlª[AW¦Ðe³:¶ÉȾ¥&^2 »T=ñýø‘DÕÚ–÷¶kßþO¾yX P„›|a]¾e4a­)üNd—a/×ï~=@<,ôGj8ªç'ü팮?Õ„è€;zÂëÕV¸œ?é3ßP#³0ÃdMf#×_È“ÚÖqKñÊeAÒ78G|õìÄ·¿â¢:Žî;¢o"–S¤#]ÊÚ±t•²áû쌬ÏT=5j2I&3†ý#Góxendstream endobj 60 0 obj << /Filter /FlateDecode /Length 374 >> stream xœ]’AN„@E÷œ‚ÀL7UšLz3n\hŒzlÃb€ .¼½ÿÿQ.~'oj ^5Õœïïîçi¯›§mÉ/e¯Çi¶ò±|n¹Ôoå}š«Ã±¦¼ÿÎ|éת9?ôëë×Zjü¡ŒW~ì/¥y®Ïäe(kŸËÖÏï¥:µm:cªÊ<ü+…x}âmüùëñ˜”¶Å IâMR€7ÄÛ¤o‰9)ÀL’ˆ%)À pbÚ'ðà… @àI:M‚6 hÔ(°Q@“ F"^õªÈWET¢ª‘Õ•NÕŽUƒ‚IèaÝ4¾q|‹IFb—`G´¤_“³ÑÙpO¦»2Þ•Aß4‚qƒ¾iãA“¤QÒÆ¤ñOŽks]óêú®œ#8|]ÎNg‡¯ËÙéìðu9;ÓõAqr?~«Âû]±:n[™w-¦ 7Íåow×eåS5R}n¾»endstream endobj 61 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3166 >> stream xœ…W Tgž2h§•ÖΠQ[TÔUk뫊ÖZ_U[K”B„$Ã;!BróäBx$Bx ˆXµ¶ž¶Ú*©Û- ìj«­]kk»gÛª»õŸÝßsv' †îqwOrr’ùg¾ÿÞï~ß½DÐ(B ¯Ù´}ãŽó£ü?"¸§Ü”QÜ3ÂlœË}ÿ "BHwÊø3‘/G{&B #·t,=Wž’”¬Ÿ•0;|þÒ¥K"ÃDE- I"–§$ÄKÃ7Å+’Å’xÿ#-|»,!E¬È Ÿµ,Y¡HaÞ¼ììì¹ñ’seò¤³#óSÉáÛÄÄò,qbø:™T¾9^"ßÜ_ÖÈ$é™ ±<|“,Q,—1MºZ–.? ÈŒÏIHÜ,Þ—´-%M2Á’iÓ—-_1kv䜹Q±…˜Nl%^#¶;ˆ×‰7ˆÕD M¬%æ눗‰õÄBb±‰ØLL$&“ !DÖJí¦> ¦‚?6Ú2úΘ­!!!;CªCþ<6rlÎØwÆ~1öŸã¢9Ï8Î>Ôçpsû…\ÞC*3 Uê'‹æ®&8Ôš*6‘ì@qeGMv¨»¼ûÐË;÷dÉö1`6—òßÁ¬&•é°_ÖÕlù&þTôÖ¤#‘šÐB{·£¹ñýÓ'|@/Ï‘jF;K–Åñálé¢E¢‚zÈî©D©#@u$šðåÝo| n¨aîê¸PŸ¿õ‡Y f7Ó(”üºbKvÌî5ì r>Jw£,z†üÁö¼r㎠Qþít>tÙ'ønµ÷ 9 ª QЊ‹sp(Á0‹©+ë¿GãÑ84Mg°ÇÒë÷øï^ûúêç'wDÏY1}¾Ë}hÞ0‡q|Ыߧ=òvé9 ÐX‚‚ÑT´j0j[lFNÛÎÄß2µð^ ÏT¾ü‘L¡é(N‚œzM­Ò£m†f0;o•9½}Òó1PŸ¾³s &æ/X|Ÿ¹O}´ÄG/öçJ›ýhN²Æ{m*ikwýdqx¾»ríW0%´ê+òÖ»½g—ƒú¹õU*Öì´|PN<*Àô%ò!W(Ô‡ |Bn=·˜{Þ%PxIüò7—~—ÿ×|ö¸ö³BØKàESuAÃè݆ HÀP\ô†¡@½´TžC]Wg±w40'Ï›çie÷_ß;’Ý,i`S=2ÛrGLŶ 8Dl9Èk¦4¥‰1–%‡v0;쇭Måï…ªÔÖ):¥¶”®Ïw§A€VñèæH- dŽ’ί̕`sXEi}ªÄ¯,eò牢…øŠLÄšÒ<0€:ì…ó²ów.ü±ß¡sI³ ur=£Z­/j#tÔØÁl©el)@$o5J[\<¾õVÈ´2R—¯LÚ¸¨ wmYùI«—µµX[l-Ž‹“ù|Þ}ä“ocÓPDš°Ù· ¥ó¸½õc‘zÀÔàH• ³Ä÷‹Oð'>):K{•H€ŸÇBXžîV¹Ë{¬§­Êú»u«RoÈ6êÙµ¥¸¢ð³Ô«§·ÿøA¯Ã{”©Kï(9 Ts#t´È@¥É[&»í ­K)ÍOÊÎ(x»8¨I‡?CãºP¨% <.gýéò=YÀ›gX†^¨g£"¶Þµ|PŽà€²“?àYø9¼Hç¿8œ9¢Èšf&²Ù_Ñø~<^”œõÀÁþÌýkl‰Jó×~dûVÈå í,rÊ3õºü"F!Þ›Ô »zûΡPÄ8Ú ´’5MPyüŽ«½êhß\Ø…_ùŽœ6ëÂ|Þ´a§tß—Õ}Häôó¼Öqgÿ{•Óñ¢üú}­[ Œï!ø1<ýiõÍ÷O¸Û»Yc‰±Š(Ìo*‡ctôkqï_B‚�6Xÿr–¾DR¼‹U-]ûòz †¸åT<· Ü{të0)~n§’ªôû|4ËîIEFr&§×v(-é¶f䢿eJÉüÌþê7Å0Fù%'™È_î•Øä6õ+#=P¶CÔpâSzÑã>Á~ÔÎç¾m§ÛjàK4%²3OÆ£ñ8þSt}¡'Îßð^Z’WÈf¼½+'¨M+ºf«{鯳ƒ@ýÏPƒÁ¨}(¾‘PŸß©G85˜´ºM•Ö{WKÏ%°ìí+P5mŽÃ¿yËö$¨5ljšA“?š`ÿ/Cãf)¨)ùœß8·½ôÉ™^Û+pž=Úôç„H⣋¡ŠÍ”&»«ëÍÖ¥iSêç×lÔyŠêØ–¥Úd“»‹@¹ÝµÍµêÎmŠøÉn6ÃR‘ ÔŒß-˜—äJ3ëÙ…j?ßêtp F±(V½2©µW_EOñ²£}·Ñxü¬5–‘¢ÇèÝ’®Ÿžíõ½{hì¦×¶lf¥ø'úÙ-=‡ëjzŽ5±-.\êæMX»qFÂ\?e_Œí÷¿'¢»}µONRrSÑú‹c}p†º°}‹üÊÿ(=3²ö]h¿hÒ©¯ÉK•»su%rc1«ÙEP@­<™yäBëµFÞ`Z¥¤%ŒÑX—T‘ÖÚì°µZ›Xk£­ª©IJðèïë °¨“ŽB¼H~ÓùfüëÛÖÏ~Xæ«îs|W>}[ÈÍäÎÓ9YšB&Ïpgy[›šZ<çž™ÆG õSÒÍ$?BƒÃŽ žIÓF J‚ øãéÿ°&^Pš0D~jÄ&W^ÂÈ@‹ýXˆŠ|´üÀÃÁ7Œd¬­?¶”{~v¬³ ¨J§1©ÈXÊë9;Dº¿j°ú¢c°ìØÁEñÎYµýíM£>šZ%9¤¦+ôÍ™þùyÿHsZX¿Ž³E¼ñÿ·æ`œïvƒ€‹ä.Ó&»ÉfÊYT“•§ÕèôŒRûÒÒ˜e ¥±çy»{ê[±ßl?“ùþXÛý’»‚#i—Ÿ‡4ÿ &5)üÊ~%K!:H×W•Uê *K,øOVVjÀT~ŽZ‘ë(.+aQ%~_Æ uªBÈJ°¼Âb+÷d©ûøjKù¶êuœÅvuÅŒË9hßa¯¶¢$AOØ­eà¤Å®Ì\Wâ£ñ¶…ç2- ç¶´Õdo(gP?ðPs¸Žë®¿ömzÏŸ (¹.»XU®s±·WÔãQ /Êp –â'uú"-¨¨b[¶·Õ åè˜?,̺Ñh*@ûÐ4!ê0ѲͻTy:1GÙ”º*Û}}qû]YOÜÞŒ¤Ô$oV{¹L–!7îrQB. 5Ò…„/dàâ0øD!ºÑG·)š“SR$b‰'ýpggÛfh¢på>ÁЇü_ŸVîqѯ"Á <…mÃñxò¦þ‚žAO£hƒkðuú•ÄkwÐÆ;(üúÅîEóñ³sñ¦vœ¦Š[SVVi\$Î-{Ì7º 3:(WLÿ–=ª©endstream endobj 62 0 obj << /Filter /FlateDecode /Length 391 >> stream xœ]’1nã0D{B7°l…óÀ`“4)²²{™¢‘Å)rû'[l1žMŠóÀ¿{xz|Zæk»{Ù.åw½¶Ó¼Œ[ý¸|n¥¶çú6/ÍþÐŽs¹~“×ò>¬ÍîáyXÿ|­µå†:Ýø×ð^w¯ þe;S.cýX‡R·ay«Í©ëòišrS—ñ¿¿úãíÄyúÞzè³Óu\‰cvˆ£°f‡X…Svˆüú©ç5J×q%î³CÜ Ù!„¼¤÷E½.êï²C¼¦ì“Ù!BÙ!†ð˜âQxŸâ½pÈq &L.™T2±Qr«¤VéœâYHõdý$}p#¼Ú Ö‡ °>¬)€õaH¬+@ `}XRëà XV€Àú°¤€’b² \.É÷ßz#ð}à7‚Þ(¨ÖémÂF!£ MØ(d´ …Œ‚6a£QÐ&lÄU³õ3D3ÍëÏx¶åsÛêrõP{h5¬óRÿÍýzYuªeš¿7Ëendstream endobj 63 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3437 >> stream xœW T׺ž0Aˆã³w†ªE­/Ī@­Š¯ ŠVÄG}`Q‘ð "ˆ€† ò¡<•¢‡úµâcЊmµ=G±ÚŠÖz=ýÇn»Ö\z¬•ì½öü{ßÿ}ÿ?#"$6„H$’Îõõ÷ŸìjùëÂñïÙðÿ%Þµ|ù [d'Fv’Ú÷ýà’#ls€Ïb‘H“:W©U…ËÕÎc6užìá1}¼³›««‡³—"H²)0ÂÙ7P-Rª…A¸órå¦ µÖyÌ ¹Zé9iR\\ÜÄ@EôD¥*xæØñÎq!j¹³_Pt*6h³óe„ÚyI "ȹût»æ*‘1ê •³¯rs*‚ —e¤*Z»qÓæ -ŸËýBBÓݦ|4uÚtw‘žk×O˜8É• –Ÿˈå„?±‚XI¬"æóˆùÄâSb2±ð&¦>Ä"—XB82b AƒˆÁÄb(1ŒÉÄLžp ŽÄh8a2™hyˆ 66b©x‹¸]2VR.Ûu¶GÉ=Ò~Òƒ”•BéÑçDß±}[úîWc7ËnOÿ¾ý íÛ§ÛŸ¶ÿËa„Ã\‡ޝ°ç+mœ?çÔió`ÙMðäÒõ¨x3‡LP¡pÅ^TÄÁm¬#˜BíEµu*”Àn€ù¤ìÈoל8U¤\Êà¸ÍÒ®uû,ë&ô^—H>]}h#»¹„h4”°w79Ñ3T›Å|0„Óà8ñ –`ÉÄ1ØË~6`óë#pbp žJ{ùÞxøówß]½vÑÇu¢ïl/VULâàr„\Âmð„RúÜÙS®ŸóѸù>ó?‘ß;Î`ISà¡”zD¨óWƒÛã÷×hÃCXYg¾(è À/Mÿ 0Ù‹4˜`†wËŽ€ –пœ{ý™ÌèÒ¸jDUJö’¾q_½H»ØŸ•ÝÜ/­KÛÂ`2Q…áU¨„½Û<­#("‹-›D¡D‹ÉWô8]ã ‰ ç˞ ØM«³ãv©r"²?-D©½õu¿þX¤ˆÚÅdÆgÅ×!ª ¬YZ‚ªÑ;t©zfƒqÒ ¬öžô<þŽ•=lÞþÃ֕öl u]·¼à–ŠI/ÛQ…(9Šc?”& Um~Ifc!Ó|Joèr«ÿñ8+{ŠþÓÆ°œžÄ]æžDünf1¨x’w²¸Z8´@v¿C–£ŠKHÆã£nIT£böÞIŽ»Ü~ýö¡Ž2d”‡fÄÆ3¾~ÛÔˆš‰NV³]Áý-ô¾R¤þ¬§3ÃŒ¨ QídI5ª«B:6î]Œ¾!ÓAŒ“=“Âf ¯ê¨”¾½"ŸgŽngdš&Ô´§ÑdA³ã$ÜàDU|¤˜Ÿ#©í…£5?&‹ð ,‚¶¦7V$D÷€«%AІ -G•¨à«n²üؾVh¢`²!4ø¼}¼—¹dŠmØ ÕŒ¬9°IÐëð^ree‰kQ€6$œÂŸKÚ¥oiüµ§ÚÍÝ!æ·€ˆ6E ´„mú¸T&m«f¢¦Í½òóqHa¸ñ Ja3ååº*DUKkÚG¢<{)~o ¶ûåpvÿãÒ×)¹ÜáëWþl¡ƒ‘îoLïœð¹ïȉ)k® ÝXòÅp,7Ëð€ûþ[@ÒŠ¾Ùgª¡ L2Oº<À}æ¼¥W;]ùîÊÅæåþ=HÞ;9Ñi3T b,§å¨ÈEñ ÜoÜhì€íŸº CŽÝ¯¶àÔnß©IecV¯HQ¢ÙhvK¿¨ÌótQû¹ÓWÐIÔ¦ÊE½r/8r"Xlî¼+†\‹zí{åÔþyëªeväon0T–˜ÎŒ>ž¹þ#fåh«”Ÿâ621JPÇ^aUV÷ºô”ˆÅìäDBÎõ‚E z9Dñ((JŽÔ(%e%feîòœG™Ô¥±ê˜øˆYQ|ð5Ø]ddùgïÜq¼Nð¡F0H éͺ²9è¥Ó½ÆwzÙtPïV|ªúY¾–þ/â? õµqH‹¨°nVŒèk·Iƒc{ò¯›X̧RYsGÓ±¦Ê¢x뤚W"¹ñÆ¢ÿsIºÔ€€tSlܺYÉ$îW–…"Jv; )tÑ1ݹãí¹ß…¦™. ½Èߢ-]Z“–””ÎM[•¬Ñ'dÄê‘’R•¥—7å8̼ôt•ZÕ”m…îÚœÊËÉPc_:K§lOKG:*¼•0ð€ü*/¿žÝ+íîÂ%ƒSÈs'Ý8ô· ­G/¢(°s¹íqßÓ¶˜’K•¥¦Âô/Sò˜â£ÇêN#êÎÍõSæ¯YæíÏv¹²ÎCçt¸ciDš7 ÚèäÅp—nýÚt}K]Ÿs K±Ýüµ B«uK°¢´=;w1uuWQ>¢.·(å‘1lX”J¬÷Û‘ˆP%{fé¬ÌQòɉ…Ë–,_ìºifÁ±(6''/¨*A¥ŽI së\0øŸ2²NtuÝ9ïÚ+ßÇ ª¹ªVñØI§lEzG…æ§Ö1ƒ ß^^\heψ[ÖÑ'ðœü*uw£$£QzÆÖ8áaé%E Ot¿Ûâߥ]è[†ƒ©œÓÉŽ•fÈÐÿµüPZŽ6¤nŒ¡ÀR¥V]V¡©)a,.—j‘º¾,;gÏnf_}SÙYAÞ92ÇçãyK§+í>­ îΠ֨Kb)›Ýšp|rÄŒì§3 õ¥›þÆ6ðDþ=è:V Ûó0~¦‹àý_îÜCûQIrNºp¥!-]··ÚPZÛüí‡x˜ðéÙs¼ $sž€èñO`ä”lÃÈøUhU|ÀF œqíƒ67ÇqúÜŒ\}.…PF6®Ì|„ZìFfäéKc·oùÇíS ½¦zûÍí:–‘oäD‡Íg„*Ý_¨“Ø /Á‘ÛP:ÚPZZPÃä@#L€9Ü9CYV*¢, 1øG2­D‹¶#*ÅhØ@©Åìo@妰Y¬´fö7C¥Ùò Ø Åð’žã{¤õdëñïoY»ÊÏwÃöûpú‡}GšÑêδ[¸¶›>ÃÓïèçßG1²g³c}6{؇§€#8=¸×yÃ眗‘™ëiwïV3wöÂÏÎ,^²À{¹{À=Ú Q`ؼª¶Þ²È{쥷៌‡RPpflIvNN.*¥ª´†(U\¼"¬lžÐý†Út„5ņſñXìâ.pNÞsâΓèdé‘& ʦ=W^º~÷jëµC&u\ »7´pµÐõz”ŽÒ³P å¿ÂϽ«(aÄp¹# ¢~˜·éô?ÈÂÔÐ GI¬7Y.¶Ç­AdHs£÷$¢¡áhGDFR"î?dÔ;gg’Ir$—7 Bö©Å.¶k¬Éì€v  J[o¬ÛUS˜Å”€½í³wÌãA‚ŸuEÕU¼ÁQëÀQ ·x ݨؤ ßRU º®ŽÁç$oÍ wºs/F =@%¨hé‹þ´ÕGÞÝ>úk‘4Ì* ±6OÊõ5÷cúJ´J»>œÙ®?Aü1Ø}öendstream endobj 64 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 217 >> stream xœcd`ab`ddä v 1400q”H3ýaîîþ~ü'kc7s7ËâïÑBß™¿3ð``bd”ÖrÎÏ-(-I-RðÍOI-ÊS©,H-/ÊŠ É0000ª30d€´±ÿgâ¹ÏÀ&¿,û¾«\è{îcû³â¾OÿÉ$ZÒUUÕYÂ!|¡ÛgŠWŸwOq{Ú¦nŽå½ëÈOe~Ð{ ïЄ=“{¦vOî\X9¯¤›ƒ¯qÚ§)ߦ±ý.ŸÈþžk/·ó4{N[Qßendstream endobj 65 0 obj << /Type /XRef /Length 98 /Filter /FlateDecode /DecodeParms << /Columns 4 /Predictor 12 >> /W [ 1 2 1 ] /Info 3 0 R /Root 2 0 R /Size 66 /ID [<1fa9bca620106fcd1690918916194266><19e85b06875aaa02f5657c051db2e5fa>] >> stream xœcb&F~ñ‰ Èc^ÄîúkL lG~“þ$˜$€„p=à6œß@bB@‚±D¼qŸ€ˆ` !~ HnÌ}@‚å#HbàÝb±ŽƒXF 'ù2 endstream endobj startxref 44032 %%EOF Rmpfr/inst/doc/log1mexp-note.Rnw0000644000175000017500000006607313735036657016436 0ustar nileshnilesh\documentclass[article,nojss]{jss}%-- the LONGER version %% NOTA BENE: More definitions --> further down %%%%%%%%%%%% % \author{Martin M\"achler \\ ETH Zurich% \\ April, Oct.\ 2012 {\tiny (\LaTeX'ed \today)}%---- for now } \title{Accurately Computing $\log(1 - \exp(-\abs{a}))$ \\ Assessed by the \pkg{Rmpfr} package} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Martin M\"achler} %% comma-separated \Plaintitle{% Accurately Computing log(1 - exp(.)) -- Assessed by Rmpfr} %\VignetteIndexEntry{Accurately Computing log(1 - exp(.)) -- Assessed by Rmpfr} %\VignetteDepends{Rmpfr} %\VignetteDepends{gmp} %\VignetteDepends{sfsmisc} \SweaveOpts{engine=R,strip.white=true, width=8.5, height=6} \SweaveOpts{pdf=FALSE, eps=FALSE, grdevice = pdfaCrop} % defined in R "<>": ^^^^^^^^ %% an abstract and keywords \Abstract{In this note, we explain how $f(a) = \log(1 - e^{-a}) =\log(1 - \exp(-a))$ can be computed accurately, in a simple and optimal manner, building on the two related auxiliary functions \code{log1p(x)} ($=\log(1+x)$) and \code{expm1(x)} ($=\exp(x)-1 = e^x - 1$). The cutoff, $a_0$, in use in \R{} since % version 1.9.0, April 2004, is shown to be optimal both theoretically and empirically, using \pkg{Rmpfr} high precision arithmetic. As an aside, we also show how to compute $\log\bigl(1 + e^x \bigr)$ accurately and efficiently. } \Keywords{Accuracy, Cancellation Error, R, MPFR, Rmpfr} %% at least one keyword must be supplied %% publication information %% NOTE: Typically, this can be left commented and will be filled out by the technical editor %% \Volume{13} %% \Issue{9} %% \Month{September} %% \Year{2004} %% \Submitdate{2004-09-29} %% \Acceptdate{2004-09-29} %% The address of (at least) one author should be given %% in the following format: \Address{ Martin M\"achler\\ Seminar f\"ur Statistik, HG G~16\\ ETH Zurich\\ 8092 Zurich, Switzerland\\ E-mail: \email{maechler@stat.math.ethz.ch}\\ URL: \url{http://stat.ethz.ch/people/maechler} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/1/31336-5053 %% Fax: +43/1/31336-734 %% for those who use Sweave please include the following line (with % symbols): %% MM: this is "substituted" by jss.cls: %% need no \usepackage{Sweave.sty} \usepackage[american]{babel}%for American English \usepackage{amsmath}%sophisticated mathematical formulas with amstex (includes \text{}) \usepackage{mathtools}%fix amsmath deficiencies \usepackage{amssymb}%sophisticated mathematical symbols with amstex (includes \mathbb{}) % \usepackage{amsthm}%theorem environments \usepackage{bm}%for bold math symbols: \bm (= bold math) \usepackage{enumitem}%for automatic numbering of new enumerate environments % This is already in jss above -- but withOUT the fontsize=\small part !! \DefineVerbatimEnvironment{Sinput}{Verbatim}{fontsize=\small,fontshape=sl} \DefineVerbatimEnvironment{Soutput}{Verbatim}{fontsize=\small} \DefineVerbatimEnvironment{Scode}{Verbatim}{fontsize=\small,fontshape=sl} %%~-~-~-~ Make space between Sinput and Soutput smaller: ~-~-~-~~-~-~-~~-~-~-~~-~-~-~~-~-~-~ %%--- Best advice, now from : % http://tex.stackexchange.com/questions/19359/reduce-space-between-sinput-and-soutput \newlength{\FVtopsep} \newlength{\FVpartopsep} \newlength{\FVparskip}% <- added as "no. 3" by MMa (after reading fancyvrb doc) \makeatletter \FV@AddToHook{\FV@ListParameterHook}{\topsep=\FVtopsep\partopsep=\FVpartopsep\parskip=\FVparskip} \makeatother % Control the spacing around the Sinput and Soutput environments by using the lengths % % \FVtopsep % \FVpartopsep % \FVparskip % % Both *topsep act quite similar most of the time, more details % can be found in the fancyvrb documentation on page 46. (MM: ==> I add FVparskip) %To kill all extra spacing between the environments, use {0pt} in all these %MM: When all three(!) are {0pt}, there's a large gap *after* Schunk (nothing in %between) %-- and that (end gap) get's smaller when I set all to {1pt} -- logic?? %___TODO/FIXME: Set of experiments (with smaller Sweave file)___ \setlength{\FVtopsep}{1pt} \setlength{\FVpartopsep}{1pt} \setlength{\FVparskip}{\parskip}% default: \parskip %%~-~-~-~ End {Sweave space handling} ~-~-~-~~-~-~-~~-~-~-~~-~-~-~~-~-~-~~-~-~~-~-~-~~-~-~ %% \setkeys{Gin}{width=\textwidth}% Sweave.sty has {width=0.8\textwidth} \newcommand*{\R}{\proglang{R}}%{\textsf{R}} \newcommand*{\CRANpkg}[1]{\href{http://CRAN.R-project.org/package=#1}{\pkg{#1}}} \newcommand*{\eps}{\varepsilon} %- \abs{ab} --> | ab | ``absolut Betrag'' \newcommand{\abs}[1] {\left| #1 \right|} % \renewcommand*{\S}{\operatorname*{S}} % \newcommand*{\tS}{\operatorname*{\tilde{S}}} % \newcommand*{\ran}{\operatorname*{ran}} %\newcommand*{\sgn}{\operatorname*{sgn}} \DeclareMathOperator{\sign}{sign} % \renewcommand*{\L}{\mathcal{L}} % \newcommand*{\Li}{\mathcal{L}^{-1}} % \newcommand*{\LS}{\mathcal{LS}} % \newcommand*{\LSi}{\LS^{-1}} \renewcommand*{\O}{\mathcal{O}} % \newcommand*{\Geo}{\operatorname*{Geo}} % \newcommand*{\Exp}{\operatorname*{Exp}} % \newcommand*{\Sibuya}{\operatorname*{Sibuya}} % \newcommand*{\Log}{\operatorname*{Log}} % \newcommand*{\U}{\operatorname*{U}} % \newcommand*{\B}{\operatorname*{B}} % \newcommand*{\NB}{\operatorname*{NB}} % \newcommand*{\N}{\operatorname*{N}} \DeclareMathOperator{\var}{var} \DeclareMathOperator{\Var}{Var} \DeclareMathOperator{\Cov}{Cov} \DeclareMathOperator{\cov}{cov} \DeclareMathOperator{\Cor}{Corr} \DeclareMathOperator{\cor}{corr} % \newcommand*{\Var}{\operatorname*{Var}} % \newcommand*{\Cov}{\operatorname*{Cov}} % \newcommand*{\Cor}{\operatorname*{Cor}} % % \newcommand*{\loglp}{\operatorname*{log1p}} % \newcommand*{\expml}{\operatorname*{expm1}} %% cannot use "1" in latex macro name -- use "l": \newcommand*{\loglp}{\mathrm{log1p}} \newcommand*{\expml}{\mathrm{expm1}} %% journal specific aliases \newcommand*{\setcapwidth}[1]{} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %% include your article here, just as usual %% Note that you should use the \pkg{}, \proglang{} and \code{} commands. % \section[About Java]{About \proglang{Java}} %% Note: If there is markup in \(sub)section, then it has to be escape as above. %% %% Note: These are explained in '?RweaveLatex' : <>= ## Our custom graphics device: pdfaCrop <- function(name, width, height, ...) { fn <- paste(name, "pdf", sep = ".") if(FALSE)## debug cat("pdfaCrop: fn = ",fn,"; call:\n\t",deparse(match.call()),"\n") grDevices::pdf(fn, width = width, height = height, onefile=FALSE)# ...) assign(".pdfaCrop.name", fn, envir = globalenv()) } ## This is used automagically : pdfaCrop.off <- function() { dev.off()# for the pdf f <- get(".pdfaCrop.name", envir = globalenv()) ## and now crop that file: pdfcrop <- "pdfcrop" # relying on PATH - fix if needed pdftex <- "pdftex" # relying on PATH - fix if needed system(paste(pdfcrop, "--pdftexcmd", pdftex, f, f, "1>/dev/null 2>&1"), intern=FALSE) } op.orig <- options(width = 75, SweaveHooks= list(fig=function() par(mar=c(5.1, 4.1, 1.1, 2.1))), digits = 5, useFancyQuotes = "TeX", ## for JSS, but otherwise MM does not like it: ## prompt="R> ", continue=" ")# 2 (or 3) blanks: use same length as 'prompt' if((p <- "package:fortunes") %in% search()) try(detach(p, unload=TRUE, char=TRUE)) Sys.setenv(LANGUAGE = "en") if(.Platform$OS.type != "windows") Sys.setlocale("LC_MESSAGES","C") if(getRversion() < "2.15") paste0 <- function(...) paste(..., sep = '') library("sfsmisc")# e.g., for eaxis() library("Rmpfr") .plot.BC <- FALSE # no Box-Cox plot @ %\section[Introduction]{Introduction \small~\footnote{\mythanks}} \section{Introduction: Not log() nor exp(), but log1p() and expm1()} In applied mathematics, it has been known for a very long time that direct computation of $\log(1 + x)$ suffers from severe cancellation (in ``$1 + x$'') whenever $\abs{x} \ll 1$, and for that reason, we have provided \code{log1p(x)} in \R{}, since R version 1.0.0 (released, Feb.~29, 2000). Similarly, \code{log1p()} has been provided by C math libraries and has become part of C language standards around the same time, see, for example, \citet{ieee04:log1p}. Analogously, since \R{}~1.5.0 (April 2002), the function \code{expm1(x)} computes $\exp(x) - 1 = e^x - 1$ accurately also for $\abs{x} \ll 1$, where $e^x \approx 1$ is (partially) cancelled by ``$-\: 1$''. In both cases, a simple solution %approach for small $\abs{x}$ is to use a few terms of the Taylor series, as \begin{align} \label{eq:Taylor-log1p} \loglp(x) &= \log(1 + x) = x - x^2/2 + x^3/3 -+ \dots, \ \mathrm{for}\ \ \abs{x} < 1, %\mathrm{and} \\ \label{eq:Taylor-expm1} \expml(x) &= \exp(x) - 1 = x + x^2/2! + x^3/3! + \dots, \ \mathrm{for}\ \ \abs{x} < 1, \end{align} and $n!$ denotes the factorial. We have found, however, that in some situations, the use of \code{log1p()} and \code{expm1()} may not be sufficient to prevent loss of numerical accuracy. The topic of this note is to analyze the important case of computing $\log\left(1 - e^x \right) = \log(1 - \exp(x))$ for $x < 0$, computations needed in accurate computations of the beta, gamma, exponential, Weibull, t, logistic, geometric and hypergeometric distributions, %% in ~/R/D/r-devel/R/src/nmath/ : %% grep --color -nHEw -e '(R_Log1_Exp|R_D_LExp|R_DT_Log|R_DT_C?log)' *.? %% --> ~/R/Pkgs/Rmpfr/vignettes/log1mexp_grep and % because of the latter, even for the logit link function in logistic regression. For the beta and gamma distributions, see, for example, % e.g., \citet{DidAM92}\footnote{In the Fortran source, file ``\code{708}'', also available as \url{http://www.netlib.org/toms/708}, the function ALNREL() computes log1p() and REXP() computes expm1().}, and further references mentioned in \R{}'s \code{?pgamma} and \code{?pbeta} help pages. For the logistic distribution, $F_L(x) = \frac{e^x}{1+e^x}$, the inverse, aka quantile function is $q_L(p) = \mathrm{logit}(p) := \log \frac{p}{1-p}$. If the argument $p$ is provided on the log scale, $\tilde p := \log p$, hence $\tilde p \le 0$, we need \begin{align} \label{eq:qlogis} \mathtt{qlogis}(\tilde p,\: \mathtt{log.p=TRUE}) = q_L\!\left(e^{\tilde p}\right) = \mathrm{logit}\!\left(e^{\tilde p}\right) % = \log\Bigl(\frac{e^{\tilde p}}{1-e^{\tilde p}}\Bigr) = \log \frac{e^{\tilde p}}{1-e^{\tilde p}} = \tilde p - \log\left(1 - e^{\tilde p} \right), \end{align} and the last term is exactly the topic of this note. \section{log1p() and expm1() for log(1 - exp(x))} Contrary to what one would expect, for computing $\log\left(1 - e^x \right) = \log(1 - \exp(x))$ for $x < 0$, neither \begin{align} \label{eq:f.expm1} \log(1 - \exp(x)) &= \log(-\expml(x)), \ \ \mathrm{nor}\\ \label{eq:f.log1p} \log(1 - \exp(x)) &= \loglp(-\exp(x)), \end{align} are uniformly sufficient for numerical evaluation. %% 1 In (\ref{eq:f.log1p}), when $x$ approaches $0$, $\exp(x)$ approaches $1$ and $\loglp(-\exp(x))$ loses accuracy. %% 2 In (\ref{eq:f.expm1}), when $x$ is large, $\expml(x)$ approaches $-1$ and similarly loses accuracy. Because of this, we will propose to use a function \code{log1mexp(x)} which uses either \code{expm1} (\ref{eq:f.expm1}) or \code{log1p} (\ref{eq:f.log1p}), where appropriate. Already in \R{}~1.9.0 (\cite{R-190}), % (April 2004) % now, both R_Log1_Exp() and --> R_D_LExp(x) := (log_p ? R_Log1_Exp(x) : log1p(-x)) we have defined the macro \verb|R_D_LExp(x)| to provide these two cases %branches automatically\footnote{look for ``log(1-exp(x))'' in \url{http://svn.r-project.org/R/branches/R-1-9-patches/src/nmath/dpq.h}}. % R-1.8.1: pgamma(30,100, lower=FALSE, log=TRUE) gave 0 instead of -... To investigate the accuracy losses empirically, we make use of the \R{} package \CRANpkg{Rmpfr} for arbitrarily accurate numerical computation, and use the following simple functions: <>= library(Rmpfr) t3.l1e <- function(a) { c(def = log(1 - exp(-a)), expm1 = log( -expm1(-a)), log1p = log1p(-exp(-a))) } @ <>= leg <- local({ r <- body(t3.l1e)[[2]]; r[[1]] <- `expression`; eval(r) }) ## will be used below @ <>= ##' The relative Error of log1mexp computations: relE.l1e <- function(a, precBits = 1024) { stopifnot(is.numeric(a), length(a) == 1, precBits > 50) da <- t3.l1e(a) ## double precision a. <- mpfr(a, precBits=precBits) ## high precision *and* using the correct case: mMa <- if(a <= log(2)) log(-expm1(-a.)) else log1p(-exp(-a.)) structure(as.numeric(1 - da/mMa), names = names(da)) } @ <>= <> <> @ where the last one, \code{relE.l1e()} computes the relative error of three different ways to compute $\log(1 - \exp(-a))$ for positive $a$ (instead of computing $\log(1 - \exp(x))$ for negative $x$). %% TODO? "cache = TRUE": --- <>= a.s <- 2^seq(-55, 10, length = 256) ra.s <- t(sapply(a.s, relE.l1e)) <>= <> cbind(a.s, ra.s) # comparison of the three approaches <>= <> capture.and.write(cbind(a.s, ra.s), 8, last = 6) @ This is revealing: Neither method, log1p or expm1, is uniformly good enough. Note that for large $a$, the relative errors evaluate to \code{1}. This is because all three double precision methods give 0, \emph{and} that is the best approximation in double precision (but not in higher \code{mpfr} precision), hence no problem at all, and we can restrict ourselves to smaller $a$ (smaller than about 710, here).% < 709.78271289338403 (lynne 64b) <>= ii <- a.s < 710 a.s <- a.s[ii] ra.s <- ra.s[ii, ] @ What about really small $a$'s? Note here that <>= t3.l1e(1e-20) as.numeric(t3.l1e(mpfr(1e-20, 256))) @ % ## expm1 def log1p % ## -46.0517 -Inf -Inf % as.numeric(): % ## [1] -46.0517 -46.0517 -46.0517 both the default and the \code{log1p} method return \code{-Inf}, so, indeed, the \code{expm1} method is absolutely needed here. Figure~\ref{fig:bigpic} visualizes the relative errors\footnote{% Absolute value of relative errors, $\abs{(\hat{f}(a) - f(a)) / f(a)} = \abs{1 - \hat{f}(a)/f(a)}$, where $f(a) = \mathrm{log1mexp}(a)$ (\ref{eq:log1mexp}) is computed accurately by a 1024 bit \pkg{Rmpfr} computation} of the three methods. Note that the default basically gives the maximum of the two methods' errors, whereas the final \code{log1mexp()} function will have (approximately) minimal error of the two. %% --- Define figure_1 here ------------------------------ <>= par(mar = c(4.1,4.1,0.6,1.6)) cc <- adjustcolor(c(4,1,2),.8, red.f=.7) lt <- c("solid","33","3262") ll <- c(.7, 1.5, 2) @ %% main = "|relative errors| of three methods for log(1 - exp(-a))" <>= matplot(a.s, abs(ra.s), type = "l", log = "xy", col=cc, lty=lt, lwd=ll, xlab = "a", ylab = "", axes=FALSE) legend("top", leg, col=cc, lty=lt, lwd=ll, bty="n") draw.machEps <- function(alpha.f = 1/3, col = adjustcolor("black", alpha.f)) { abline(h = .Machine$double.eps, col=col, lty=3) axis(4, at=.Machine$double.eps, label=quote(epsilon[c]), las=1, col.axis=col) } eaxis(1); eaxis(2); draw.machEps(0.4) @ %% TODO? "cache = TRUE": echo=FALSE: do not show already, but need (a.,ra2) <>= a. <- (1:400)/256 ra <- t(sapply(a., relE.l1e)) ra2 <- ra[,-1] @ \begin{figure}[htb!] \centering % increasing width --> effective LaTeX *height* will decrease <>= <> <> ## draw the zoom-in region into the plot: yl <- range(pmax(1e-18, abs(ra2))) rect(min(a.), yl[1], max(a.), yl[2], col= adjustcolor("black", .05), border="gray", pch = 5) @ \setcapwidth{\textwidth}% \caption[Relative errors of log1mexp() approximations]{% Relative errors$^{*}$ of the default, $\log(1 - e^{-a})$, and the two methods ``\code{expm1}'' $\log(-\expml(-a))$ and ``\code{log1p}'' $\loglp(-\exp(-a))$. Figure~\ref{fig:zoomin-pic} will be a zoom into the gray rectangular region where all three curves are close.} \label{fig:bigpic} \end{figure} In Figure~\ref{fig:zoomin-pic} below, we zoom into the region where all methods have about the same (good) accuracy. The region is the rectangle defined by the ranges of \code{a.} and \code{ra2}: <>= <> @ In addition to zooming in Figure~\ref{fig:bigpic}, we want to smooth the two curves, using a method assuming approximately normal errors. Notice however that neither the original, nor the log-transformed values have approximately symmetric errors, so we use \code{MASS::boxcox()} to determine the ``correct'' power transformation, <>= da <- cbind(a = a., as.data.frame(ra2)) library(MASS) bc1 <- boxcox(abs(expm1) ~ a, data = da, lambda = seq(0,1, by=.01), plotit=.plot.BC) bc2 <- boxcox(abs(log1p) ~ a, data = da, lambda = seq(0,1, by=.01), plotit=.plot.BC) c(with(bc1, x[which.max(y)]), with(bc2, x[which.max(y)]))## optimal powers ## ==> taking ^ (1/3) : s1 <- with(da, smooth.spline(a, abs(expm1)^(1/3), df = 9)) s2 <- with(da, smooth.spline(a, abs(log1p)^(1/3), df = 9)) @ i.e, the optimal boxcox exponent turns out to be close to $\frac 1 3$, which we use for smoothing in a ``zoom--in'' of Figure~\ref{fig:bigpic}. Then, the crossover point of the two curves already suggests that the cutoff, $a_0 = \log 2$ is empirically very close to optimal. <>= matplot(a., abs(ra2), type = "l", log = "y", # ylim = c(-1,1)*1e-12, col=cc[-1], lwd=ll[-1], lty=lt[-1], ylim = yl, xlab = "a", ylab = "", axes=FALSE) legend("topright", leg[-1], col=cc[-1], lwd=ll[-1], lty=lt[-1], bty="n") eaxis(1); eaxis(2); draw.machEps() lines(a., predict(s1)$y ^ 3, col=cc[2], lwd=2) lines(a., predict(s2)$y ^ 3, col=cc[3], lwd=2) @ %% no title here: main = "|relative errors| of two methods for log(1 - exp(-a))") \enlargethispage{5ex} \begin{figure}[hbt!] \centering <>= cl2 <- adjustcolor("slateblue", 1/2)# (adj: lwd=3) # the color for "log(2)" par(mar = c(4.1,4.1,0.6,1.6)) <> abline(v = log(2), col=cl2, lty="9273", lwd=2.5) cl2. <- adjustcolor(cl2, 2) axis(1, at=log(2), label=quote(a[0] == log~2), las=1, col.axis=cl2.,col=cl2, lty="9273", lwd=2.5) ## what system is it ? sysInf <- Sys.info()[c("sysname", "release", "nodename", "machine")] mtext(with(as.list(sysInf), paste0(sysname," ",release,"(",substr(nodename,1,16),") -- ", machine)), side=1, adj=1, line=2.25, cex = 3/4) @ \setcapwidth{\textwidth}% \caption{A ``zoom in'' of Figure~\ref{fig:bigpic} showing the region where the two basic methods, ``\code{expm1}'' and ``\code{log1p}'' switch their optimality with respect to their relative errors. Both have small relative errors in this region, typically below $\eps_c :=$% \code{.Machine\$double.eps} $=2^{-52} \approx 2.22\cdot 10^{-16}$. \ \ The smoothed curves indicate crossover close to $a = a_0 := \log 2$.} \label{fig:zoomin-pic} \end{figure} \paragraph{Why is it very plausible to take $a_0 := \log 2$ as approximately optimal cutoff?} Already from Figure~\ref{fig:zoomin-pic}, empirically, an optimal cutoff $a_0$ is around $0.7$. We propose to compute \begin{align} \label{eq:def-log1mexp} f(a) = \log\left(1 - e^{-a}\right) = \log(1 - \exp(-a)), \ \ a > 0, \end{align} by a new method or function \code{log1mexp(a)}. It needs a cutoff $a_0$ between choosing \code{expm1} for $0 < a \le a_0$ and \code{log1p} for $a > a_0$, i.e., \begin{align} \label{eq:log1mexp} f(a) = \mathrm{log1mexp}(a) := \begin{cases} \log(-\expml(-a)) & 0 < a \le a_0 \ \ ( := \log 2 \approx 0.693) \\ \loglp(-\exp(-a)) & \phantom{0 < {}}a > a_0. \end{cases} \end{align} The mathematical argument for choosing $a_0$ is quite simple, at least informally: In which situations does $1 - e^{-a}$ loose bits (binary digits) \emph{entirely independently} of the computational algorithm? Well, as soon as it ``spends'' bits just to store its closeness to $1$. And that is as soon as $e^{-a} < \frac 1 2 = 2^{-1}$, because then, at least one bit cancels. This however is equivalent to $-a < \log(2^{-1}) = -\log(2)$ or $a > \log 2 =: a_0$. \section{Computation of log(1+exp(x))} Related to $\mathrm{log1mexp}(a)=\log(1 - e^{-a})$ is the log survival function of the logistic distribution % (see above)%: defined F_L $\log(1 - F_L(x)) = \log\frac{1}{1+e^x} = -\log(1 + e^x) = -g(x)$, where \begin{align} \label{eq:def-log1pexp} g(x) := \log(1 + e^x) = \loglp(e^x), \end{align} which has a ``$+"$'' instead of a ``$-$'', compared to $\mathrm{log1mexp}$, and is easier to analyze and compute, its only problem being large $x$'s where $e^x$ % = \exp x$ overflows numerically.\footnote{Indeed, for $x=710$, $ -g(x) = \log(1 - F_L(x)) = $ \code{plogis(710, lower=FALSE, log.p=TRUE)}, underflowed to \code{-Inf} in \R{} versions before 2.15.1 (June 2012) from when on (\ref{eq:log1pexp}) has been used.} As $g(x)= \log(1 + e^x) = \log(e^x(e^{-x} + 1)) = x + \log(1 + e^{-x})$, we see from (\ref{eq:Taylor-log1p}) that \begin{align} \label{eq:log1pexp-asym} g(x) = x + \log(1 + e^{-x}) = % \sim %\asymp %% x + e^{-x}(1 - e^{-x}/2) + \O((e^{-x})^3), x + e^{-x} + \O((e^{-x})^2), \end{align} for $x\to\infty$. Note further, that for $x\to-\infty$, we can simplify $g(x)=\log(1 + e^x)$ to $e^x$. A simple picture quickly reveals how different approximations behave, where we have used \code{uniroot()} to determine the zero crossing, but will use slightly simpler cutoffs $x_0=37$, $x_1$ and $x_2$, in (\ref{eq:log1pexp}) below: %% Notation x_0, x_1, x_2 are related to the 1st, 2nd and 3rd cutoff in equation (10) %% -37 18 33.3 <>= ## Find x0, such that exp(x) =.= g(x) for x < x0 : f0 <- function(x) { x <- exp(x) - log1p(exp(x)) x[x==0] <- -1 ; x } u0 <- uniroot(f0, c(-100, 0), tol=1e-13) str(u0, digits=10) x0 <- u0[["root"]] ## -36.39022698 --- note that ~= \log(\eps_C) all.equal(x0, -52.5 * log(2), tol=1e-13) ## Find x1, such that x + exp(-x) =.= g(x) for x > x1 : f1 <- function(x) { x <- (x + exp(-x)) - log1p(exp(x)) x[x==0] <- -1 ; x } u1 <- uniroot(f1, c(1, 20), tol=1e-13) str(u1, digits=10) x1 <- u1[["root"]] ## 16.408226 ## Find x2, such that x =.= g(x) for x > x2 : f2 <- function(x) { x <- log1p(exp(x)) - x ; x[x==0] <- -1 ; x } u2 <- uniroot(f2, c(5, 50), tol=1e-13) str(u2, digits=10) x2 <- u2[["root"]] ## 33.27835 @ %% but really the above is still ``non sense'': look at <>= par(mfcol= 1:2, mar = c(4.1,4.1,0.6,1.6), mgp = c(1.6, 0.75, 0)) curve(x+exp(-x) - log1p(exp(x)), 15, 25, n=2^11); abline(v=x1, lty=3) curve(log1p(exp(x)) - x, 33.1, 33.5, n=2^10); abline(v=x2, lty=3) @ \medskip Using double precision arithmetic, a fast and accurate computational method is to use \begin{align} \label{eq:log1pexp} \hat{g}(x) = \mathrm{log1pexp}(x) := \begin{cases} \exp(x) & x \le -37 \\ \loglp(\exp(x)) & -37 < x \le x_1 := 18, \\ x + \exp(-x) & x_1 < x \le x_2 := 33.3, \\ x & x > x_2, \end{cases} \end{align} where only the cutoff $x_1 = 18$ is important and the other cutoffs just save computations.\footnote{see % the %\R{} plot \code{curve(log1p(exp(x)) - x, 33.1, 33.5, n=2\^{}10)} above, revealing a somewhat fuzzy cutoff $x_2$.} %%--- Ok, still do a little deeper analysis for the interested R code reader %%--- invisibly mostly (echo=FALSE) here: <>= t4p.l1e <- function(x) { c(def = log(1 + exp(x)), log1p = log1p(exp(x)), ## xlog1p = x + log1p(exp(-x)), xpexp = x + exp(-x), x = x) } leg <- local({ r <- body(t4p.l1e)[[2]]; r[[1]] <- `expression`; eval(r) }) ##' The relative Error of log1pexp computations: relE.pl1e <- function(x, precBits = 1024) { stopifnot(is.numeric(x), length(x) == 1, precBits > 50) dx <- t4p.l1e(x) ## double precision x. <- mpfr(x, precBits=precBits) ## high precision *and* using the correct case: mMx <- if(x < 0) log1p(exp(x.)) else x. + log1p(exp(-x.)) structure(as.numeric(1 - dx/mMx), names = names(dx)) } <>= x.s <- seq(-100, 750, by = 5) # <- the big picture ==> problem for default x.s <- seq( 5, 60, length=512) # <- the zoom in ==> *no* problem for def. rx.s <- t(sapply(x.s, relE.pl1e)) signif(cbind(x.s, rx.s),3) @ \begin{figure}[htb!] \centering %% using "blue" for the default method, *as* in Figure 1 above <>= par(mar = c(4.1,4.1,0.6,1.6), mgp = c(1.6, 0.75, 0)) cc <- adjustcolor(c(4,1,2,3),.8, red.f=.7, blue.f=.8) lt <- c("solid","33","3262","dotdash") ll <- c(.7, 1.5, 2, 2) ym <- 1e-18 yM <- 1e-13 matplot(x.s, pmax(pmin(abs(rx.s),yM),ym), type = "l", log = "y", axes=FALSE, ylim = c(ym,yM), col=cc, lty=lt, lwd=ll, xlab = "x", ylab = "") legend("topright", leg, col=cc, lty=lt, lwd=ll, bty="n") eaxis(1, at=pretty(range(x.s), n =12)); eaxis(2) draw.machEps(0.4) x12 <- c(18, 33.3) abline(v=x12, col=(ct <- adjustcolor("brown", 0.6)), lty=3) axis(1, at=x12, labels=formatC(x12), padj = -3.2, hadj = -.1, tcl = +.8, col=ct, col.axis=ct, col.ticks=ct) @ % increasing width --> effective LaTeX *height* will decrease \setcapwidth{\textwidth}% \caption{Relative errors (via \pkg{Rmpfr}, see footnote of Fig.~\ref{fig:bigpic}) of four different ways to numerically compute $\log\bigl(1 + e^{x}\bigr)$. Vertical bars at $x_1 = 18$ and $x_2 = 33.3$ visualize the (2nd and 3rd) cutpoints of (\ref{eq:log1pexp}).} % Moved into text:|| down Note that the default method is fully accurate on this $x$ range. \label{fig:log1pexp} \end{figure} Figure~\ref{fig:log1pexp} visualizes the relative errors of the careless ``default'', $\log\bigl(1 + e^{x}\bigr)$, its straightforward correction $\loglp\bigl(e^x\bigr)$, the intermediate approximation $x + e^{-x}$, and the large $x$ ($ = x$), i.e., the methods in (\ref{eq:log1pexp}), depicting that the (easy to remember) cutoffs $x_1$ and $x_2$ in (\ref{eq:log1pexp}) are valid. %% moved from figure caption: Note that the default method is fully accurate on this $x$ range and only problematic when $e^x$ begins to overflow, i.e., $x > e_{\mathrm{Max}}$, which is <>= (eMax <- .Machine$double.max.exp * log(2)) exp(eMax * c(1, 1+1e-15)) @ where we see that indeed $e_{\mathrm{Max}} = $\code{eMax} is the maximal exponent without overflow. \section{Conclusion} We have used high precision arithmetic (\R{} package \pkg{Rmpfr}) to empirically verify that computing $f(a) = \log\left(1 - e^{-a}\right)$ is accomplished best via equation (\ref{eq:log1mexp}). In passing, we have also shown that accurate computation of $g(x) = \log(1+e^x)$ can be achieved via (\ref{eq:log1pexp}). % Note that %% FIXME: %% a short version of this note has been published .... %% \cite{....} a version of this note is available as vignette (in \texttt{Sweave}, i.e., with complete \R{} source) from the \pkg{Rmpfr} package vignettes. \subsection*{Session Information} \nopagebreak <>= toLatex(sessionInfo(), locale=FALSE) <>= options(op.orig) @ %\clearpage \bibliography{log1mexp} \end{document} Rmpfr/inst/doc/Maechler_useR_2011-abstr.Rnw0000644000175000017500000001227112174274363020212 0ustar nileshnilesh\documentclass[11pt, a4paper]{article} \usepackage{amsfonts, amsmath, hanging, hyperref, natbib, parskip, times} \usepackage[pdftex]{graphicx} \hypersetup{ colorlinks, linkcolor=blue, urlcolor=blue } \SweaveOpts{eps=FALSE,pdf=TRUE,width=7,height=4,strip.white=true,keep.source=TRUE} %\VignetteIndexEntry{useR-2011-abstract} %\VignetteDepends{Rmpfr} <>= options(SweaveHooks= list(fig=function() par(mar=c(5.1, 4.1, 1.1, 2.1))), width = 75) Sys.setenv(LANGUAGE = "en") if(.Platform$OS.type != "windows") Sys.setlocale("LC_MESSAGES","C") stopifnot(require("Rmpfr")) @ \let\section=\subsubsection \newcommand{\pkg}[1]{{\normalfont\fontseries{b}\selectfont #1}} \let\proglang=\textit \let\code=\texttt \renewcommand{\title}[1]{\begin{center}{\bf \LARGE #1}\end{center}} \newcommand{\affiliations}{\footnotesize} \newcommand{\keywords}{\paragraph{Keywords:}} \setlength{\topmargin}{-15mm} \setlength{\oddsidemargin}{-2mm} \setlength{\textwidth}{165mm} \setlength{\textheight}{250mm} \usepackage{Sweave} \DefineVerbatimEnvironment{Sinput}{Verbatim}{fontsize=\small,fontshape=sl} \DefineVerbatimEnvironment{Soutput}{Verbatim}{fontsize=\small} \DefineVerbatimEnvironment{Scode}{Verbatim}{fontsize=\small,fontshape=sl} % but when submitting, do get rid of too much vertical space between R % input & output, i.e. between Sinput and Soutput: \fvset{listparameters={\setlength{\topsep}{0pt}}}% !! quite an effect! %% % \newcommand*{\R}{\proglang{R}}%{\textsf{R}} \begin{document} \pagestyle{empty} \vspace*{-15ex} \begin{flushleft}\footnotesize Corrected abstract for ``late-breaking poster'' and ``Lightning talk'' to be held at ``UseR! 2011'', U.~Warwick, 16th Aug.~2011%, 17:00--18:00 \\[-1ex]\noindent\rule{\textwidth}{0.5pt}\\ % horizontal line \end{flushleft} \vspace*{+9ex} \title{Arbitrarily Accurate Computation with R: Package 'Rmpfr'} \begin{center} {\bf Martin M\"achler$^{1,2,^\star}$} \end{center} \begin{affiliations} 1. ETH Zurich (Seminar for Statistics), Switzerland \\[-2pt] 2. R Core Development Team \\[-2pt] $^\star$Contact author: \href{mailto:maechler@stat.math.ethz.ch}{maechler@stat.math.ethz.ch} \end{affiliations} \keywords Arbitrary Precision, High Accuracy, Multiple Precision Floating-Point, Rmpfr \vskip 0.8cm % Some suggestions: if you mention a programming language like % \proglang{R}, typeset the language name with the {\tt \textbackslash % proglang\{\}} command. If you mention an \proglang{R} function \code{foo}, % typeset the function name with the with the {\tt\textbackslash code\{\}} % command. If you mention an \proglang{R} package \pkg{fooPkg}, typeset % the package name with the {\tt\textbackslash pkg\{\}} command. % Abstracts should not exceed one page. The page should not be numbered. The \proglang{R}\ package \pkg{Rmpfr} allows to use arbitrarily precise numbers instead of \proglang{R}'s double precision numbers in many \proglang{R}\ computations and functions. This is achieved by defining S4 classes of such numbers and vectors, matrices, and arrays thereof, where all arithmetic and mathematical functions work via the (GNU) MPFR C library, where MPFR is acronym for ``\emph{\textbf{M}ultiple \textbf{P}recision \textbf{F}loating-Point \textbf{R}eliably}''\nocite{FousseHLPZ:2007}. MPFR is Free Software, available under the LGPL license\nocite{FousseHLPZ-MPFR:2011}, and itself is built on the free GNU Multiple Precision arithmetic library (GMP)\nocite{GMP:2011}. Consequently, by using \pkg{Rmpfr}, you can often call your \proglang{R}\ function or numerical code with mpfr--numbers instead of simple numbers, and all results will automatically be much more accurate. <>= options(digits = 17)# to print to full "standard R" precision .N <- function(.) mpfr(., precBits = 200) exp( 1 ) exp(.N(1)) <>= choose ( 200, 99:100 ) chooseMpfr( 200, 99:100 ) @ %% Applications by the package author include testing of Bessel or polylog functions and distribution computations, e.g. for stable distributions. %% In addition, the \pkg{Rmpfr} has been used on the \code{R-help} or \code{R-devel} mailing list for high-accuracy computations, e.g., in comparison with results from commercial software such as Maple, and in private communications with Petr Savicky about fixing \proglang{R} bug \href{https://bugs.R-project.org/bugzilla3/show_bug.cgi?id=14491}{\code{PR\#14491}}. We expect the package to be used in more situations for easy comparison studies about the accuracy of algorithms implemented in \proglang{R}, both for ``standard \proglang{R}'' and extension packages. %% references: \nocite{% MM-Rmpfr_pkg} %\bibliographystyle{chicago}%% how on earth do I get the URLs ??/ \bibliographystyle{jss}%% how on earth do I get the URLs ??/ \bibliography{Rmpfr} %% references can alternatively be entered by hand %\subsubsection*{References} %\begin{hangparas}{.25in}{1} %AuthorA (2007). Title of a web resource, \url{http://url/of/resource/}. %AuthorC (2008a). Article example in proceedings. In \textit{useR! 2008, The R %User Conference, (Dortmund, Germany)}, pp. 31--37. %AuthorC (2008b). Title of an article. \textit{Journal name 6}, 13--17. %\end{hangparas} \end{document} Rmpfr/inst/doc/log1mexp-note.pdf0000644000175000017500000047664414136173547016446 0ustar nileshnilesh%PDF-1.5 %¿÷¢þ 1 0 obj << /Type /ObjStm /Length 5303 /Filter /FlateDecode /N 89 /First 751 >> stream xœå\YwÛ8²~¿¿o“œi“DŸ¹}®—ìÞ";ét&ý K´­‰$*Õqú÷ι_¤ÄM2e{Î̹÷È4÷BµŠŒ³€…†)D–i¦ð?da¤™aFI±W,‚s&ðg”Á “‚+&$“Z 2š @á{Í‚€ &B¦Ü{€ÒËS6Â-ô2g:´À˜¶@$ ƒ(b’PÒ–IÅŒ pØŽçCf¢P1iXÄG;…v¤e‘Ñg–x ˜•€HfCœ„µ@:Ê\ðˆÀ‘}qá¹€z%ÑpáÀ Å– –ÒXô* Æ7€¢¾K`¢9ÐèäÀ„è( +Œi¼”¤+€¬ÚR€¬B\BYÑ€¬…ÕL²6ZôF„Ô¨äPO×0©4 ‡ÆZrhC  Áq »f¡£0Ä]a4à‡€lBa„qEb@ޏÅ3€x2äH=´"¢Ð*0"cXÈ–£!Cä”d+Œd«è [Ö ÛcbÙFÀÓ„ 6X€’\bü ÈÌ8}”\ "(7´E¹ÅøG’ø \l¥ lâ Éq$d¡4qÀNŒ„gû‹YaþëocþIœö‡ý´Ï¬ó÷˜¶LÇ£i¼ß»óóþ NTvrùc3ÿÏ“öË/Äþ2½MæìÙIžŽ¦ì䟃Ûq<Žçæq?%Ó£~³gG?£«ix¤iþÊå_8ÿKñA8î_ÆŸØ÷QzËnÑÒ|_³Yð(à±wñïÉ|¸`Ïöƒå¼?øñ;ìOñxìša/æódþëýÄNÎ_âo2»&é%“þTȽƒd(äØÝƒñÒ®/¿gw_ŽÆ1(—WºtÚŸÄEð L÷h°?½:ÀœŒ ¤“F®›‘Æ“p»‚²•¤²!ëïÎ_¾‡†NúéíÅÉU2^¾×‹o–cmIè WBß"ó¹[É<ùV[e>×é­2oÈ­2mrßü™ÒsÅ1¼õõ•“ö_‡G¶¢àìùî?êânÜæ÷g³yr[öÇ~~Ó÷ŒW¯ús4½MGéLîŠ{‚Ž&ËÁ­?MÁÅGS;™a•}ùöE@÷¾…{Ã:÷ÞÇT]ÙX‰®lüöÕÉåëO…¼Å“Q+ƒ¹¦ûÓÅh}aÍΰ¾ ~Vu~Æ•&?·2oØ•þ¯òMäæËùJ¶p¯pG”¸£}76›—)‹ ¦ l 뤥›L8Á­‘ÖÔI»} »aP;aýOy§جAå÷/Ž./WZ±UME¬¦¦à^7èÖè*«nÕS9ÔVR+´åÆŒ×4‰†cC´¤­ m]þ)_Dv}N‰§Æ\—­¬(3dHP)!¤•àF Ã0˜(3A$kð3©Kò2Sfïй Laí è ",XÖP(D¥]96OßäרqÚÓF0£¢ÿ3zg³Cc³«Ãt—éÈá¿ô_ù¯á<½õßùÇÎ…:óÏuéð?ú¿úŸïu¨\~<ö·~œål³n  XÚUQ¦-è<ãaÒm[S³TÑ*.Ë~Fg:Áë,2«£V§,4Ð-*\í[žÈqÈð¦ÿ÷ÉWey{Ù:ƒD}ÊågŠ8É ±ÈY¿ñ«¼ì8¹ÌÅ[øU‚›°Íu‹t[àQ¤ ×»‘‹:›öè^ÓŽopï‹ý·o;Ë]Ƭ­vû^8›kV¦ŠôÔš‡%ßÎÃr «pWÇ^æ‘ ™RÒî¦Å„ªétÒü²à~ÂJY2ö¦ ÙYÍ7Εwáìf5^Âd¼ ?[ŒÈ \C¡ßPÊ7ž»Àª|¶VÕ‹1Ù‚»nꞨ»k äZx3¨óæ=<Ò•C¥vT©g—ï^n÷7 yÍA“q±¼G§V2ö5~$ÎZû›N«®ÜÇ2§Õ]Ķk…ÛØäÐðfÍ){€ë–Ú|?îXN®Çñ]œÇwƒqâxyÔÝ¡PÕ똷9£ñ0SÔwÝ]‹BK‹¶Ûêº$lfÌÎjz“_QŠÀ‚¦Dœ¿?¾88 L¦ÉÎ!vÐ Åd#Ä–ÛC1[äôÛDC¯ò²t”GÝx bq­í¼íz^Ùüÿ8l»žŒ†ë“´¤AðÊúäª8qå rF÷þˆ‰|Cbˆq\ÑVÛÍæœnªª™sÉ z¯Øò~féª'¸éìÛ\|øXq¦£õƒišó€7Ìy[äÕš1—ÝC"íf¸•˱+Ûþžês´Ú6séT[SÉ¥W,ß1@>Ÿ» ÙtDÜT=V1ðiÜ#!CkäoÄÜÛIÑ™ô›Âš’‰-&âíþ§Ï¿®d “tk«fˆìâH¾-äŽdX¢£¨l¼tÔýG%yykGÈ:µ·wã±ð˜s„œ—C~Œ‹&î%2¶Û’ö¡,•6Y°Zoä‚®Ü<,ís±ÿþÓeo÷mS@ª™¾ êñM…ocÃm‘võZ‰kt…¸îtEÜR¾Ô]y +"¶ù6tÛÕ‘]'b#*Ü8˜‰h69™ ²ýúþÍáª<Á¶Í4j„Zæá‚º7yOð'ù¶àOE¡Ûš"J91m„ÛÚDXñl£Ÿ„@nÏÝY±ñÚQŽYÁ-žæ9ojÙ9p¡’«§B碶¾_R(®8VÀa3«}P`…óO@¦£ˆ²*F¬îR¿$6íúçîàI*†ÖùFðvKÊ‚Á·0§nîèTX-Ïífƒ¶ÍíR|³eÞgê¥yh·%žS[Ü5Ü£´T#û"y#šÛÈýžþnZçŽ.óÀ±MΊª¹µœ5ƒ¶ 1¥³=.ù¶éîj㱿M•͹ö|J5ÛÒ»z·­Åí8>Mîeç\Œn¾ãRƉ^=áÙ˜­u‰Ï<çRK·ì<#[J°´$W2 lfS¢•¡«úËav“´Q#ˆ—¼1©ºI&:Kߦ©5—’̇ñ WMÕë^êY8—adR›ùÑÈlöΕfiZRp½ã‡ÇçÕréÖD\Áª[& TÝ×oKlK¹µå8TXÉqd§+ª %ø…‹¯`Ÿ•˜·MÜÔ©“•—¨mšßBlžÎÄá]umïàôüüø¡“Üa3)å\‹ªšÕɲ-ÚªÆ n)†Ú4_Ý‘Àþ•…Ò–JÝz.ÉJ)Èô~ó›¦Qµçn50hù­té:{·‰¶O¢¾yñþãéYÞìÃ\Õ–5½kÂ\ÜWø°½èà)·v¶ÙÄX¼£:[>M(½{?ªmíZA5Õëˆ, ‡wºŒFY<žgYüBMRÅDð5 œW³“ÙQþÏ **!~žq+Jõå®voöO—“«x¾Ýìð5Ü·U*.ÏLFz»—^l.¼°Õ„ø¨än‡¼eÆ_ŠF®n»ð–‡s'5¿Ñ¢;>ž^¾}z¯î(j¨·Vf뺳NÏt6" Þ¦T{™·e™·e³o/]ˆnÖM 85š4ª0¶JGeÞgÎ[7¢8É79n.oÃ#ªµô, R-ohåQúžž¢/vƒPzœÂt)¼HuKÛ<¥ÐzÊè&Jƒ‘TV{®TGž«ÙÀKÒŠ J2Ôž€S—a ôèÛ^Q+ÿÅm › ‹YágèÛêÇãÔ! ˆÈÕãLjHEÊ“«xЦbxˆ‰Uh<ª ÿ· 1Ñ'%=¡ìS µ…vÖx:Š˜àÖ3aƒ›„ Ààš‚&ÏXZ´Åz¡¨Ñƒ®©R—³¼`þ‡Þ›ÕnˆìÒ³Û4ýìû‡½ýS¯·7›'´Lˆ—Ì© È­]òß«Õ>¶º(á­ x‹•@TR‚ºC`,ƒÝ ŸñÅSo^Á»GNÃtp/üޞس{³~êÎó?uQÚpöͻݥK’kH³Ê£’G-´Ax7е_º*Ïå÷-”K·æR~ìÖ[Ê +Ìy/ j¾â˜VËÉMËâ]¥™,ޅґŻڭ©”,(ÞÕ´°SqlXP¼«-- ”Ó—Åó†d(ŽIx‹cªÆÏiõ¤¢­ˆÆ©8v‹ Ñq=ƒæ‹Àä芼ÐOä(‹¼ ªšÅÏ›x|¿ŒÝ²ø¤<_òƉ¹À=”°P|M9`+íÖÈ𤮠Ð`­Žjg=ÂóAk.~#‹o‚3h/îÒW)-F$T)%Lkb=`×hg°ò)•*ÖO°dÏkT‚ô› vÝ/h!©}ƽ•[¼nÅô™Ø‘YJ6"à6„‡xô¹SÝ Ã ÑúiAÄ=%ÝŠ/ÎP0ósŸÌPíÀªJt‚•iµ7šæ“Î)SOëŒí0VÂÀ% ha;é´øZD€—`×Q¸z”« WŠ[„´J\qFúºð1z¤«ÄJE’nÅüBÞ¹ÊÜÑÀÍ–W /™ÅÓ›y²œ9 —Li}(ºásnC®´µþõrêÞ^ønñ&ï6Œw2qp§#0”©ãÖÕö{ÖÒÚpÆã]=Åÿ´NYîYX×Ð °%Õ²x ‚áà–Îʵc¾ÿ^õŸvAæÎƒk ufƒüiásjZ­À³Ò>ž“þhœ&?Oú±[áîPVyC^œÞþé vò‡„°-.˜…´Š#§‘Õ€ u÷Î!šãèÏâd6Žý¢;áL^6œQøn°8 ç`ï(ìêà÷ñ–„çÑèú:†!"ËówWðW®ÜbÕÒ-òÐüëkl#lNmå–¤€÷F9«ö³j-?­PT­çwX–¿ `ÕoÜÇ•O h­·òW´Ú[ùó—™(‚à¾ÕÈ¿Zx¢^Rægý•øÓ ›½¡)£òœÎÇ ¬‹”žåÚ¢Fôøz$Š ÊK&Ñ×4«E‘Ü÷ºë5”\Mq±†R¶~ÕUþD躿Ë?(V|˜íØ0–%ˆiÅÁ,û„­UE˜òã%¢>yÿîU!èa¶þË—#©kZ’ä_#.´æ!b‰^']Û!ÿ/·%ê\endstream endobj 91 0 obj << /Subtype /XML /Type /Metadata /Length 1512 >> stream GPL Ghostscript 9.55.0 Accuracy, Cancellation Error, R, MPFR, Rmpfr 2021-10-27T08:53:27+02:00 2021-10-27T08:53:27+02:00 LaTeX with hyperref package Accurately Computing log(1 - exp(.)) � Assessed by RmpfrMartin Mächler endstream endobj 92 0 obj << /Type /ObjStm /Length 3750 /Filter /FlateDecode /N 88 /First 813 >> stream xœÍ[[sÔ:~ß_¡G¨SXÖ]Ú:uªH C€0ẠÃÄ“¸Î\rfûë·[¶<¾N<ɰl¥˶lµ»[Ý_Rœ 1q’0ɈSDpNœ&RÁEC´€‹–.‰s„ÅúÅ1aBph0Âþ‰áÄHlÂ\Œ}$áŒãE¸Šý£„k awRAÃÁ´…†#BX¸Âb"4×Ð`DX¸Ï'2DJ…·$‘ßÌ‘΀,LÅ86 Q‚ãS–(i°áˆò/„ÛÊ¢˜ð¤Žt†ÏÔø‘Œ ¢ÁàM¬@x®àƒvÖÄä} 1ÚÀÇÁÛ;bœ†ˆ‰õ_ RZŽò€j¬Jh€.™Ä:ÔPÄq…5qBb ¢ FØÙAÃBn; OxÃhòH0Ñð¸`ŠI´‹Á*4ö—4¶ü5Ô6× |‰Z–¨G™[Q£åÐhx(vðr¦8?] T>Ú5áý M¤ÑbÞ…T¨¸¥Tµkñ}µ Í4êNâ5”š{5kT¬OcÚ+%G·1jQ+T | „tØ2¨9”ÇÚÂûñ«„¥1T¹ŒÁŠ Í!ÑhÌ+KèƒF“Ç0èâ ŒÌ êT£= ªY[ly}áèè7 2º4jΡÆlŒúò¿ÿNè“d‘ ÓfDèÇOÿˆb¢¹ŠÐŠ‹ëÙŒ|!ôUr“á„ò½NÇ«d‘]œ­’oÄäí·i6KȃÙò‚]}~ðù!/ÎIrs5gþlº\¸÷ù#ðòç7Ÿ~~øüñ‡æñb±ÌÖ Z_ˆvͬ8r‰—‹ ¤XÎókôeržŽ–7ð<>¥œŠÀídèøK)¶Ì{’õòz5IÖG>‚·y?)>i99KP/ôôÉ|~ýš?®|ÕE„.4èdC…Fˆ(æMš^:QÓáár~u³t¹ Ëi¡¶ß¶*MéBI¦8Úâè:”&ö¥4ßCiº¡40p„“>(­KOª¡§Ådv½5•9¯/}óôìøí§ßN^Ž–óñ‚™G£äâz6^út1Yž§‹ B?¤‹Ç‹uº¹p”®ÖÙá%ô‚ å?¤¬Ò« Ü×庤'ã¢Fczvý5ó߈_ÊÂç2|HϳK´Ìzÿ×~¤·ÎÿâGƺ1WcÍþž”^¶ž ! LLz8¾zž¤—áÔ€†@zAgtI—‹„^Ñ+´Ý,™fyk…OЛ‡Þøþep|z4_¬!Sçú:¾èoJˆf8Æ—üæQ:KønáxéÕxžl³óq6ž¥“Ç‹ ðìeº^ƒ‘½M·hº,™¿‡Y5ZÅÞôcñ©¼²å_oÞŸ¼~ã¾g—ùPŒïèdšƒ"©{väd EÓh²MÅhùii´qÕ"¬4@> £°Ü-𠛨¦MnÑÍ Ã:&þ³'Ž‚C¨M™³mÑ0 vdgY{ΫÎ#ZšäqÅ$¥A´R€êöPxŸnXC·fHŸBÚA^·!Zºúúŧ¯ËÉ?:XÎÎ+šGx’KW*œwÍÕŠ´l ÆµiƲm?ʨíçMoõ.qeWwV‹l7þ*^ ûk¨'°å|êFAðÌ9À{R‡”Æ_Á~yoüm95Uçò§ç¢è˜~¥×¾Né%Mé_»çeôþûR4dUº¢kšÑkúÞе藾يx!ÆÁ¾¬_úfà õLÐÍ@Ï|óáøã»EH:û1ÿºœ­»0¾²á¡m$ÀbÓpС@ÀÔkÚŒƒ­+6ËOK›ÍÓÅõº+(4° |º¡tÛ Ûu1TùP¦Tþ«7‡‡/kù`W<Ö™*ïÈ4ß @i¨*põ'´áaaüòOqâüÊO~P)°ª#äüYDâ²Qh  ’ñ, ®àé0ž$@‰‘R$Ô‘‚ê0¼*I‘¿¨žžž‡pë: œ(·"€À¬ß‚­+ p³Ý ö¿õÌ+ýoýJ%Û»û³£õ7"ÛiW9djëÙs/O‹=P’ßšÉU­Èž¤«Éõ|:Kn°Êþûz<óÔè|{Š^'ß’”Ù­\Œ4k_¥ ÷,xHGn‘@½Ž1´Úã}¥ö& ƒï¶òøÙé›ÃQ­XéôJâÿ†‰c^)wõʰ:ÕG˜¶ =ï wð4¹y—Ï•nÀ3¶Ml÷­#À„Sp§õl¼¾ì%ÔÛŽ¢ ë.Gi‘Û 6˜LÌœ?yvZ'#ºãVÀ–Ûˆ™À~îLÌ`´i3¼NÌð»3êñé†î[•ý-ºªüø6¾v$у1 W&’ˈC¶äŽ1TOx]ì&éÊb5Ctæ`T-"ù³!Þ¶¸Âî,v„Ê:9c‘2z¯R™ŠTPF8ÀŒ†áý›ª’.‡¸‰´Fp°Èo¤pwògéJÅ6Šq?¨ €QC(Å ¶a¸FE1äÅ3„1¹°1î )QßBSBŸ!x¬Šºjxª6õÀ#˜h2@(‹õzÑÆ?– óüøŒLdz5²5I6e ŒI vúþÓëO¿=Ofß’,…>Õ0VÃÊ0Ö7«qJ´Ùv‚%T¬Á‹—dHø áµ£¬,þæ½$¸!¿ƒ’ÞNýŠ¿q¸‚òä×ò}ùM—¡Ï+¿²ÐHœ¢¬óÓ2XŸx2¥\õ Óô[˜”œGñá|6åjýsضNoèújSžq¿]/œ)¿U¯G¸ÄÃÊ‹»Yekµw%¤÷ÏÕÞWðV#7.{†þàj2H½‰è=®„ao/΄/êCÅü–1!,İÜ8DÃÛ´ZYòy~øêÏJÏÆ‹Nd¾mqÁvä>i¹; [µÓmZ]»úòŽ«-o§Ð±õO7¢m‹ÑîÓÇ@tîØ>ÀyuËá-„! Mn®x‚GÜ’Q PPÃ7Ûþ³À›ÜŠ¥›ì5„ÀØoeðk±NЮ˜ ˆÅúõ¾dªî2„IÁD8€¹m¶ùÅÖLG~_·´ OF ¶ˆ¬¼Ó©{vvŠ˜Nù éTÜCrhŽû´YªDkOêÃì»ûÛÙÍ- 7öo c]pÓžœ¾}Ø0½cPSăjnYRƒ·"°ö1, kkÖµ-!/‡‡5Ÿo„µÖ>Ê^• ÝPï%®UfFˆk1à(Ý‚W8M¹àái¨8Ò’Á|ˆ¯† U[2ò´ƒ–XQE¶UJ3&"'ðBDäÿo³ÿ%¥ä{¥Bv‰l ü ÔOw%#ªŠçN~TÙ!,A*i Añ¥j†¶:èÂu2ðT_hÛ‘šè…b=+={ »``½îí7Z±óññó§ï>TVô»¸Ú°þPÆL¿‰´4u‹Á^Û Êm‹Lùòg=ŠúÞ:Qß[÷<2ÉzbiX«ÅRá_ш¥­Å–~ ÝûÓ·åág«B‚’¸a‚.º£f>š* Eµr¿,pA &s!D ¿ûF Á¿†+…`Q1¨¬™'‚Â>§Lͯ ðRô—,GÂ]ji8¢B Œ¤C÷œ/Óh<™û ,Ž” ˜ñ:ƒѻ쀹’B`A¡ÆäÆ”o"1t3ÃÝé áÙÁøî gÖÿƒß`2¤’[ÐQuÙm@¦Ù½ê¿Ï¦‚;q,Õ¬Š^“ª:úf”JþØ®Ÿ¤Ói²J¸3Ý$§cÑмzþ¼Ô¿×÷ù¤—§¢=½ÿ§b:Ýûç"Ö¢ÉÕ:APÀ{:¿žeéÕìÇž†Bîf³}bO/Å}~½¼û}ÿ?3¯endstream endobj 181 0 obj << /Filter /FlateDecode /Length 5480 >> stream xœÍ\IsËq~¾âdR(F§×cÍÚ-á Ÿ(Y6Ÿ V˜ô¡±½ 4Ó@ÿ^ÿgf-]Õ Š …ƒÎLWeUåúeV6þ¼b-_1üÿ¿Ø°ÕõÉŸO8ýºŠÿ]ìVÿzvòò-×+n[ÁµZ}8 SøŠKÝZµ²¨p³:Û¼k^­%o™Òº¹¸¸;týÕöÓúTZ ¿5ßìw·wýææzýßgÿŽTmEÕ»ÖÃG¶:»BÛõ)k™öÚÕì¯×§Ü·ÞsÛ¼oxšïËùÒµB æ7_­Ïþ4]?š´ÂÕÃVNxÆ›[ZNzËœ„%æW`­"Mÿ ¶dl˘mþ‡ ^È÷ÓÅýT]딑"P™Ù²j­L¦E߯߯iל{¯â&+ᜠÌv«SXÞsã¼W4IY¥lsÄϾ)>+o¤–ÍUù¥zpEÈtsNòe^6ƒ\ûW‰²b·b­Ö™ßowÃÎ߸ -™õ͇âóa=w(mZG‰„n»‹5ÈÂ{Í›ïHnq£ÝõU1ίµ žpƒ80E‰Öh%oi®±Ò3˜{ÍÄ#©Ö;U?û_X7·WiwÈØçQ­œ2~uÊe«•‹,Nåá‡æì߀²”À8Ùü×=–38îæb-Lë°öãð;®rªáü^Û@VG9ÞT›í‹H—«æ·ÁbwÆ5}žxgÁ¸H·+Ýzk ©AúÈVPú7A…_!¸Œú§%mÃÑÐWq`IL‚¢zfV§ÕÈ3‰»PÒ‚rzEO^Ç'0 ¬fxð®ùãרpŠ|Çê÷çp¦õ¶„GN4¾À/:|a‚ƒmà1_Ÿüž]݃WûÕ‰of˜Ð­«Ý‰bøº=ùâӓ|.ÇSúªŠ”åñ…j‹Î –Ž*Ë£Â~tÖ¤ø¼¤ [guí Gó…© Žöiñl®ù9~D®èfK‘€ãçQ$(בÞð:T{ñ­°ÒE§ ì #ì 5Nº öF¢6ËÖpÜUIÉãL+„ñ øÆ=W«Ó‚Ô—Oâ\µ$O‰ÌÊ‘:”Á­0¨Î”jÉ4 ±~VOŠ0„ª©I€ß´B§½]”{ë²]@˜9E·(M¡Ø² `¢Ðß»âs´®Tùærç[oÖ¢/¢ðÀÃ6ºŠrüb᫪#ž)Ÿ¶q œ/'›à°ÁÓ6db 2ìâG¯›ã¦Úðö*2už_›íeù­¤u :9û|,¼Vp*é èÍÀ‹>i?œþeDAÛ5£š®vméð@«+·ø°ÙnºÃ§t|1C˜t·ÀˆJ¨ýf_>;F#P•“O:ñæM‘ƒ­<€=Öa…ñ"ÜÈÝé‘»+l0Û¸Š6.I"hâtóã9§«ÀedŸù0kpÆËêAµ7.Nžv‰Îz.:Bêa´Å?Š'ÎXŠ'Ê©r÷ÕÖLëŒBU\Ú¡ÍÙŸйÌ*´exôcí/$G ïj‹©\êþû/æNn8JÓÕAðõpòü) d³û Ï‹qïêpO.•׈j[Ç5¶Ï+×õ¸Bc, }åü›·3{ÁšuôÉj`НY„®Ó-«2…¾Ö+fåð„ãhvC‡êðPàPÑU:tÓ|ûðW1 œ.GïÁ-ӢȦ±‹œïþpU;Æ é!o°m1_§5!¥˜Ä%Ü-P¨æWQmƒ MÒ‘ž“ÅHÒÈJˆ£ˆ“SÉÂgÀËöø¶ZóC¡‡­˜Í!’<Í®÷õÇ1<€œ˜6åz5û*°°9b”$K˜Sn¢‚îì*ôÐ׬ó„Äø.›W <Ò1úÜez¼éŽ›Ë¥@–â°DBI&H’2X$ïAÇ}¤nlI%㺀Jg@à¿Hôû@µ4Hi/ø3`iaô%¥˜„sï’/Á0¼‰­ò ñÊá‘ø²wT­6Òýb\ðâZ’EΆ[Hã-Œ~‹§¬@ Yzñj—höèóÀ¥áÙiÜ?̸×J˜z´ÏY0:uɇtC ¬Ð'ó¤À>™²”œÆ(êþ°VæJ[oÕÁ¹›žLô5ºX_ÖB PbrµV·Ö§ZȬA{¯>Å:€¿?ÀoÀ'0“ËãlYEiˆ"›íO¨ Ñ¼¢D•c1V!”» Ú@jL‚ßÅ ÿ™Ô¹«F“OëÒM( 4ßDþ(¹F¤l —†˜¹J.Ûm×ÇÚŠU•çpØrAÆ6o_D6ûæÛß5Ÿ_†˜8èìÊ…ei¨ŠXÁPÆ€W¶©‚‘¾>VÁÀ*˜3¢,aPåB­ ÆÂ|ʶ½CƒÕ *®AØí{ª¼§DsywG1(~F5¿Ù÷±`G{}&U Aa@Âá x±«‡X§“š›æG¾HÅ6ßœßõižHÀ;BÚ »¹i3%k”w AÑXöëƒÌÛ€!‚.J¬/‰¡ú" ø0{w[Hý¶`þ6)ЗË8´n×õE¡®©†Á³M¥gG:$f@²Ùô‘¸¤Ð¡³ë2<Û$òª/iëªùî¦ ±'ÛäÀ¼û4ì­T&’…ñ(ß·D’þKHÔ¸¬Á4 7´Ý—k\GÂ^ ú¸ŠäLÎãaŠC^¿oRþ`P N-”*Ó]ÿž# Q(«¦}2Bœ†yfÌqZ,e6Õeßœœýó»!ã°ý‚AA¯ˆ Åt©|ØIÎQŒ€ {šˆc,€ôŒ UÞª÷ýJ¨LRšÿ¡uØïð¼šEéGʃ\— ì\©š·])Ú‹E}Ü®ª p‹ 8nNûæ׳ܶB€/’'nä#ì…¸«œåtbÂ_,ŸF’ß#çÀBÝûþcð÷°¬iKJq3„â׿6BÎÖŒ*.|ŠeÕ¥ëû™‘n´L²„L‹”nI9Þ¬ü5?˜å`“Œ®x QëSØg+y^& ©¦0ŒàX¸˜- ØÛÜ59V>àEB¬Çï;|ô«±ì£BB‰H²j™à¥@dQ[…*‡–Æ~ˆMÀ6—Kîör°\µ(¸åÈ3ÀÉTΙa¬BË2ÔØ‡ÎydíO¤ÌUˆ·óÖÎÚ¢rœroLwP3¥VFÜT3ó‚É8ÜT ›‡bžc¼T½a»i V•j)nG2­¾^ðwé!ä_Re7P>/dÑÆýòFxšî· fTlÐÎÓ(ãÀn³í!'d¸Î‹õœèN¹ñ Q]©È`N„²åY&ï&ïmû“(T©úrË=ZM”’*¼üq¥ “AuÏi¼ôxUšŠýßÄ­0=@Ϻݔ¼=@êX1þÉBz7¶u¢š?²]£X{÷ˆ·Æ!‹ÒEéõP¢{¡ø«8ÒÕPç˜ –žªD„hTѸALÀT0c¿­h,âÒqB›çœ÷­ò “Þøg›\¢2.'Î~NÅèVƒ”© Ç­X£«3VªsŸ©ôµUîÒZL¤ux7 ¤ÄaÕœ…<ÌILŸñVG‹æÓ6ð3h᱊Z)mHAìÅ0°›h§Ø¦éð†VP:ý-%[¡Ô nÖñf)¶n󩬵ÛŠêMî}âáúßQŠr}¨Ì„‘K…™¯iݺ/Xw¶åZëœ|L¹\kÈÁÛ¤&Æ]Ѳp«i[ªÕ,݉9JªµoðOË‘?Ÿ;é¨0$óE.”Üð¤ö©M¢•KË/ßdvi‰ØH ª=ÃwÆ?^€„÷FÜP %|Ô”D¿þt>StOáñXÜÌ~É\‹§0ú)‡•Õtž ¶°ìÓ~öìÈ:2™RKàØsa$0T<Á ù ©âãÌ?u5VÑä¡òÖ—Šë ;²¿ÔÕ1\Ñä~K^K¢×Ç‘¿‘äi}ý@>»§Úý,iÿóÝOè„_ö>R»Žãͺ¦âGÉù,øÁ[ˆ…Ït=qá§=ÏS;,°”üœþüGêLù¢$ã9$#Îe’٢ɢ^p r6žý‡vsª°j"ÄUKB(æMjù‘ÉÊͼ½ÂôÜÕ÷£%ÜW$ï35ÜTì* kOø“‹…Æ2¹¬Ûúý2– áì!<‹ïüçÚ!uO’Þ{1ϺE‰C«Ì¶D°e ª<8DéG·\fŸ—©îuªG,GsQÿL x›ÊùÌ%“ÖTF¢;Dü¬YSé9l›¤ûª„\—…œ5Ô;k•]”¼”ƒêà‡jUµsÆ[ê`+¯çŠ|.šPWm} ýÃJYëˆØþà ]׻ЪAÉ’ FÕMÉÌÝ47~|ËB±U‘¨ËÇD[…ä;Mê=Âì»î®Î¬6uî¿ D»ê×êKõV=.ÞOéЕç-åOgc…ÓãUžŽW‚[ßlBk»¸Æøê0•ÞRê‰ÜŒ× ³m¤è¾e`ù¨ˆßm?ýO™ù¥ Z9±”<µ%Þ¯„ÎÌôIM4ÆðÎ9N?tiPÏÄL žè(4#©¿•Š®AÑêšAÝe2ÛQ @úáÕPJmh©_- :Ÿ¨}fýs 0 »ºþ»íÉIZª’îqMÑ}âÄâîÄt/Å•¼å>æ Ñz\úoW“žwS³«]Ê> µòÖ7Ž4úgóPŠãNÚ*›…Ó΋E½Ïì(*¯!)Œaœ¿™XOUEŒö¶&F!V|䨼M/ Ñ ™|ñY=õ‡sê?®¹Í”Öu¡…ä0,}-ctu™œ®¾£ÖnA´ën·+¿O4“ÚÕ¥kö‹Œ½ ç›Ó»-ÑbT• èh4ºº8/Ϻ Sy(ì¥-1zgsì뀑WT‚Ý絛=šÀŽG#޾Áµ~ 1LðæSö±r„®¯jm­žÆ…e躻º›à(‡u ÿG¥“Òl ¤„žö !y/Gê1>–R>Ój(¨X=» @è–K[îåoÒ¯ „oó—d9hÛ—´+h@ ¾&"ùsw øpEYˆ¹JYH_• ;ý’mÖrkjá&œºÚ,Ê²Ã±ŠŽÑgBõ!&àÖÓŠužT{…E‰¢2×:Å™¾<0×WvDç ôn4P6¤àÙRsUau}æfO5(r×j“*BO7(6_ãk,|„1Ê/tÿËmð?s©ªÂ&3ü¬„B²–8¿êgWîðÂs¦½¯¾Ì½\R²¾,®c빉iÔÐ긧?.¡è…±#'Éi]Ä‘ð‹_rÃ3 s3ÓM›ßïà‚ È#V»¡-¦þù—Ç^ñ¨þG²%/[k¬8j¶Uƒm‚-ãËSÞ˜øÇe¸fÖaÞâXÎ[ðY±ð."þiøþ& 0 ßæðø aèhXx︿;\\á_ã¡ôóƒ-ÍÓùŽ\ûb]Ü—KÅ<ËÜÌÖ@ \ W´ß#ÚœòäÐÊ‘6«"ZLјa)HŒ7Ûî<î 8Ò×·šØô˜Ã«6›¢Ð÷Ä|k&–~ìûÛŸ¼|yßÞ\õÛÍy»?\¿ì÷»ãËx¨'}a}æä Á¥‚IK‘'DìåþøÇ‡»›‹xH\Ü7¯ÞœFßfèÏ›œ¢¥WÀ~ó•Ï 'Ai_¿‰¯Ø(N˜÷bOÇbÂg›Û»þ 3 %ÓÝl~%GÞɉÏßS_ÿñwidx˜(3‹÷Ü™2Õß±þUÌ¥RXñÚÓïOþDAÉendstream endobj 182 0 obj << /Filter /FlateDecode /Length 4528 >> stream xœÕ\KoÇö™§È-A°€éu¸Ãéw·lˆm%pà¢0'1 Fä’iÔîR’a$¿=Uý˜éžíY’"“ Ðûè©®®®ÇWÕ»I]ÑIÿÂßóåQ=¹:zwDݧ“ðç|9ùæôèä%“ðIekK'§—Gþ:1t¢¥®,—“ÓåaÓÓ7°V³t-—U–Ÿ^½"¿›2Xo'çÓY]ÕÒòZšüÍí_ ì%›f7O¿[ü8q΀„"ß®—7ÉRÿ˜´Â²kWÉ»«éßNÿŒñü”VFtœ-ÖWÓåUM #g„†g¨MŸaªbþò™?쀦{IÎ 5Ê7îPÖj _&Ÿ=þð£40DÞÄðl3^q.;g'§'+­T9~SâÌë:HœMϦÅK4µ¦¿Åí6;ÛàíE¸#.Èk¼ïš[âî 6«ár®ÝÝpMkd¤˜RLûCj‘î¬M¥™Ž¿ 7L^o‚ˆö”¯Ö2>>Ûœ;Mä Go›«}.rQϸ¶ Ær2ŠF)'¬ß{II0‚ÊêÚ³ ×%Œ˜Ìh¥Œ­ýÂJ‚M’º†]’… ~e¶¹¨˜`6È€|!Æ%Uñ p‰38'H[çA0›œ‚&Â}i+,s„çáâÕDÂ:øã´Ã2Cù„U†2c{^œý¿5“à7þºXó h&`5YQaMŠ?YýeÔ»Hžð ¬8’¤¦âµv†þ¶ sƒ¡6˜Íø1@R¬bÊR‘Ê1wlx¹’᥀T@äNšÇ Lg©uT]ïp@i„± `”€»ÁÂpòÞ½ª™ ™ãÚä&’ÐlÞ6¨å»ÛTG=UYKph‹¸`™â§no•|~žn·k×+|ÜÀMÒnËþÄòŠFOð® hÒ± -÷Tnˆ÷Tn/ï¦DLVÂ)*wx©Ð·»Î¯6± ›æ®=ŒÒû{(ò¬Û„¹ Q0' oµb`N¼M·‰3¡ð[™X†0u]éGX¬,’L-#¨½Éî‹qÞû³ÂªJMi.™¡IiØ„C(a°Ò‰§šÎ,¥äûË S’vê3'fÝ"¯dp8¯H³¹ ±ži¸Ìef0^÷\À®|§¬Þâ<6ë|?è¼@Ôdq`³vŠ2JÞ·{gÌĈ& ACò¯÷ áñXÂ-²Œl3Kl?P„& nBÄkùWÉn€†õ6v@«M%©éãj2Óèud¢É9]pºB0v‡F¤öxìKöï?±à”¼·JW•¤B0VêOBŽ‚P èõý’_q…5 ’z̸¥ƒSíñ7ª%hvØL ©IDÏüÁM ÌÁy’³à(jwß¡‡Û1œ¨¸kàgF"ÔÒ µ¢íäN÷KO4g‚2°x¥êR?Õ1hÔ–g%:`uXMµƒB~Éó"7xA‘ÈéË¿¾(Ña,…ÏèöÓ ˜‡}ŽR¸3àé€BÀz~.4s˜™0ãÖý¬$0‰¡`§AÜ•â•ÌÑn‡m1ž@ì¯Mªÿ Ršº•™t3Ö\cmÅDÁa­ñØççå[°3”»W$º Ê|„ ’̶G]OÒc=ÑéÑâžèô–Öìq§/;L‡ö€-îž?”j%âCb5§<=GÚJ£_ž(CE0eyÄ­„3±î“C ‚“w޹%ÒÔpb©R‘ûOpÃÚDÏ×å½¹)%‰ëèÃAœ±|èîߢp{C|¼*®ÐüøˆÓË}|1R”³`Ïð{¯˜é…»¶ÊÍA6‡ÿ¨üÿ…çŒk¥!‹ÊŽøe)¸R[!È EÂ}b&š)ƒðÇìÙ¬Èq™ÜOÍS`·ÍvÁ`É,(o–±šd;€'ʱßÇ&O¥| ªþ Ô!#ë_¶ç‘EÖ—±02(‚ø½‘C›!ˆuÎn‹F ;Ð}JĨùdƱœ¡ƒãbÑ%€n~ ¤ôæÌ…C®…ƒ¤Í §¥Ë¡æ}aÊbÜ,i\ë¿ö¹&–Yo ã0.VÉÂ:Kfñ¥î(jH}mŸÿ>q5&\ fñ$ŒÂTÜŸäÛuÈà^v›fƒÒÇŒÊÀe®ñµqGúʳÁ—µKßÖ«^àçCðyº€i ½¸ôÕ~ùŽ)0Ïë ÏFX(…Hš¤;Á!U {Ÿ8 ˜a…RR4õLÿ®\Àd˜±AS£s”ãL fCw·+¡™+©;rьפdÅ\-eÖ/ô  ¬Ê èyxIiR|…ìiŒw!+Õ!G¼3­ê¾Z8¸À‘â]iW$-¯ ±p_$81^β¸»¿¿ùzSI \;ïnð# ­Ë¯Ê7N+®Y„£iŠìê¹ÇÞ¢kÐ>ùÑr`ŽS-'íÐ&%¬r®ÊD%¨·Z ˜âYMß¿ØN“ï¾×Wþb;À7À~3¸^PO5V»p7òàq xµ¤H;~tÁe¬é“Ð{W‚UÍ !+½BY>«(ëJC+Ðà¢ÊÃ~ªÜ¢Û.÷ì¼f•¨‚ª’Üðÿ7%ÉjëãJBƞӉɒ¢¹á‘ø¸{ò3Ô’~U¸q V/:Cä–:…f3ÇR*\¸²Y´K½Q{™¼Yo–·¤ÃFd›võ ÛÑÚax˜“œn`ÐÊ*¶¨RŽ–9Nl5¼žj¶îýT¦·TÀ’T4®þÞSpF!õBtöý*Ðâ4^§Ëø|oVN6íÉr`‹A X!B„´Nv‰äÃ{¼\ALµ*¥‡F€ Ã]ÿpŸÒ_± …í'6ˆ¼{1µîê—M ¬ó"nÒÎåf[Œ_Ò¸,òÞ¥?S‡T,¶ªŒø ¾„_ÆßVІÕõ›$QJå´?TXtKEIÐâÖÙ9ä&µí½ºç^ýN×ÛKü)`CG›æ`¡²w:TNåPŸ"òJõ¡d±´Ñ§3`Ã¥6yΙ½IÝÔ&_÷ãÔ™$$¡–€•ëY¡‡qd…z*Ð@¨‰°¶¢€üÐÈÇxÔ*È-zÑÃ84,áa†8èa·©îJ0ófIÍæêÍôãjÆr’>D§ÊM.HÈ+ºÈÙÔ7ߘ¬Œ°Á=ãW=§ön—0À½¢2µ¹øöç(z ‹0ÒŒy Ÿå3`¡]¶p-‹P¨©*‘¯ ð§0"a©ÓÀoÆsþ&¥…¼8΄ôådEˆa¹Ç• ü4L¨C`ìÕäC»X„‡Í0Ôa!·Vdnç«!XcÈ—®i¢ph–žîc±´]šV9† mš"Å Á”6É4_Î1~,+°’8“ÐùæÌÔ[¯•L ÐJ85Ü…d{‡ëqß¹4-×ܶЎÐnZ: hëK®s4ããꇧHâ?Ñ·‚¨ÚîâѾe†^&¡;c L+úÊD.ê&&âÉ|(eO(άÈð(øŠÍ)a†d†»nÁxpÁtÅé“à‡°gö®‹ÁjЇ@„¢þÝb“}Õ¤ã?N]×·Ý7³ühØûч—# ¬î ÜtUû´ŒšJj•!Å'¹6#±¥ z pZ(éÅüÎ伜 ßevêg¤¨Ðyi‘‰²8")¦tŽ*Å PwEøNrr:5XyÕ,§Ú,SÌó`¢ 2=×ÓØ9@Òe ¨Ç˜º Ø\˯(êºÂHÂò`ãä&Lð3Ꭺ£öK™‹…o*¿Ú‹ û3È‘¦ºC‡ìxQœ,óX¼Y—½“@+­äå?¾ûÇ/‡ݵ—^¹@éø°jo(¨åÞ(×11>æD2âpÀJH;èwí\Hs¨¶ï@ÄÖ“Î'¡›½ðæghe íÖËf׿O.#=êC¸.Œ`ZáU ; :òþD¥è@–,4Zê[ΕsL”j÷ 5–¸¬N=óF¹NOœµ:2k¹ÝµWÎ ãpZ­LalS»†\SB¿@ô°m1„{ÒAa(÷ÊI ‡9­ÜâC}â–«# ÞoÙ¼õ#ô\t'û€Ï.Å×8¹6 ‚JA†C~bygb#µÞM—?dºÚkO%Vr¼¤DÉ)*H‡ŠÑï ÿD…•5øMnó½ WïÄ…¹­7›×ieÛ—í"NÂS~ýÛÅþ²º£^:5ûõJ¿e¾Ç:ZÖ~V,cƒ:¦fþã‹à¸ÝO9pCˆÅcmò¬=ºX„1L@Z­ÏСטü¥ü.:™¨Ç&3dû,ÄˆÉ ‡ª(z½ŽN¿ûMÓ7ÐíklEŸ¡Þ]nB?›bzÞ²°~Ç«Ç÷’|5ë¿»¼]#;g¤‰„jàµusž"˜àOh‚XˆÂ¦ŒÿF„ºúù¹˜ƒ¡S‰ xꦢ‘¸a]—Þ¿—dÖå’²YãÂþ¶±ÿŽÀ6¾•N™gs_íHI¢B¯L'f 'A3H,¸a¹þé#EA8¹°?ÿ<^¦H.œ*íús¿ 3†ÙmÂÁ^ÏÃÙj™À,â}üüô‹ÍÆ5ÜQ¸ó³~Þ¥¼ýâs°´[oSAÓTвCÇ€=_D­ñdF´æ8òiÈÍf~þM»ÛöÏtâ¦PpƒíçŸ'¹¤ÃøÈv·¾i/WëÝi·Õêv9—âô8>¯ÀWW»k¯¶Ý‡ÏŸ÷‚ Çýë}ξî9“u¸wÔ—‹¦?ezboCa;ZË/º£±¾}½è,L¹ýÚ-Zy¤ÛTeºÎ‚)ªŽ×çñEÂ]¿'#×íÕu¯ÿýŽá\š|Ѭ.¾è~»mWWýÛ]ªaçë <¿ë™8ð÷¬Ûvù§¦_›rß^ž‘¦gâ«çýWÎ>™ïWFªî³ÞR«ø­¿‡ùb;ïi ̳ê¬Úî6·ç»Û ^H¢!´ßjÖÓ½hNàAyüí¯šå|ÛË"QS÷ x´¦÷¹ÛóJêÝÁ^/¤w8}f²¢RaÜÁå* n VùÏU˜ cÊ7ü†óD}Ô=.æ*²²>F}6RÎUuE»~Ï«{‡ë!uÌâ„Ô0ÍR>Ùd8ßæÓ¡ºeZ ª!Îṯ¨ŸecŠ"FÌw‰¤»üÏ=¢N3ªö—Y“üê)ïc1pˆ Áëù¶h½À5¯˜óŠ©¸Ý‰!1wé‡ËE¸r³Æ1}€·²FöA]ጠàWôøo½ð`‰–j›yj±¹Ef߯.“¬«VR†%¬®ý÷]Îo(¦ú–ù_M0 ì[Ý}rèW ›ý/ˆcAÀrP6ž§Ù{ õ^«„Ÿ‘§²Ö‡_M~ó¾ÂûIçÞb/ü0ïçƒ}ôú™ÏÙf±iv6ý9~I]âØ®¦© Têyê Å5X(\&ãjSXÔ¸Þínžœl߯ª j¬ÄAxµë7K«õæêäå $½+Ô‹“—~IÍjœúåØš³øÚi#7ÍέÝnÎOVËfw}rqó®ºîùÿóÑ¿$’•Õendstream endobj 183 0 obj << /Filter /FlateDecode /Length 421 >> stream xœ]“±nã@ D{}…þÀk™"/€±MÒ¤HÜÝH«U "² 8Eþ>3çŠ+fg“»3u¸|x\—k{xÙ/åO½¶ó²N{}¿|쥶c}]ÖæØµÓR®7ÒYÞ†­9Ü? ÛßÏ­¶(¨ó7?oõð»ë“~:~7•ËTß·¡Ô}X_ksN)Ÿç97uþûËnã|+=Ö,Íc:åæÜýÊRJ8wYÞÇ,Gbɰ§,'"n¥€x:f)%œÀ.KÀŽxÊ6N–% ‡, áÓUÆ« }¦^c¯Á¯É³Ñ³Á‘ɕѕÁ‘É•ÑU ½lô´Ñãš^Wõ¼Êñˆë!çCŽBW±³ØQè*vï˳ӳ÷YöDÏЉ‘%`1rרcwØwEpFpŒÜ5vçØ#wÝ9vG8W@g@G8W@g@Ÿ³ÄBœ›A¥„ˆ4¡DÁD4¡DÁD4¡DÁD4¡DÁD¿!ÏAÏ¿!ÏAÏ}U½8¹ˆ?Çävÿ,s[>ö½®W}Zqnö²Ö_ÉvÙØÕBÍ…²Ötendstream endobj 184 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4216 >> stream xœ­W X×–®¶¡«DD¥l‰Õhpßp™¨É3Ѩ¸¢(*·‘E–f‘\Øl–îÓ ‚lÊ"›ÈÒˆlå–AÔãM\&“h|ÉÓG^Ñ$ÆœÂË|y·…$f™7óÍ7ß­î¯ëVUß[ÿùÏþ#c¬ú12™lÐrÏÕš0ßð©Ó&½­ õ·L–\dÒ+ý¤ár YÏóºS¬ÁV¶Vç^šf—‡ v.ÌÈe2Ÿíáó5ñQÁA;]§¹»OŸ4‰~Ïvõ‹w}{²ëRßm!šØè`Wßp×¥“='»®ÐÄÒÉ`×±špW¿íA¾¡®š×5Û×»®õ^¸ÚÛuÑê•k½¼ÇMþõ¦~>cfܼpÍüˆ¨è1K|ãüâ·yú¯Ø´:Ø;$4lê´é3^;îᄉ“& 3’YÉx1nÌ*Æ›YìeÖ1ã™·™ Ì|æf3™YÈLa<˜EÌbf 3YÊÌ`–3žÌ ƞᙡŒ’qaú36ÌÆ–ÈØ1ƒd˜ñ3ÆŠIažÊVÈîô[Ýï¤Ü_ÞbÅ[yYݱö·~ Ø¦¸ÄneïrQ\WOw›Š‹”ÙzT œ7ðïvcìŠ-T:è“Áo .â3äȇCºí_±ïF³ÝòUzDt¥-±²îvq"Kòºít%úýÑàú4]<1öüà¤Û zMFTF:įV1½5P ·¡Bωl lM~f.˜LYèà„eŠ+ÄÝz’ZQoê‚&¨‡o¡Jϑ똦${Ø[­íº­éÒÕb³e¶G9Êp Êù\©ËAôÀ"ö+¿wI¿ùžAsƒöSð_’9û¬ÕìåðW‘=Ôl…饣wÌò·‘ù´ãêñ²è·RýÛ[ì~ì7-‰Im”†™euh‹h+—ªQ£D—)ÉT2sÆ«Ä8vN©8ó‹Çh/Û<å, QÀþ÷Oÿ—6 å-'KDø34Fk‚l¤-Ÿ˜Ä$Š‹ÑZŒe—q„dl“w'cœ²8Õ¸'9’ B ™H”>Sa)L/ñ¾ÔrP€¯Ý>}áêÝ'ygà.à@ßZ²À”’ ÀU€©R…áldÆsç{ŸY\9œÉ>2™Œ"ÄÇ‘q¨GdÑmTR²NÄQf‰5öO)¦ÙhëÈ–>Ãh% “¯õ±!Û„³,ßEæýŒgÏ?Às [s"ê}àpøŸáh±u £æ¯_¦V—Ÿ0‡å‡ž9ÞQÔìrí¢qRÙý(»šda“d èÓ§ß!çÈ»JoI¬²ÝçèÆ?{øî¥‘”+ø›dÖo#y—®[÷ ’®<—²üXsNÇþÂÞ$Ý.ˆçüÌ»ªªÌÅ­]åL“jÆaµ8¼öZ­¬éî¾!—Æ¡J g"ͱ%~ ÁÙkó–å¯Ì‡3ܵ‡P†òì…Q&Á˜pÀidV¨>gK!gOªRöéIº´ MQ@v pad<‡‘88¦.MUfNÍ‚–”–(ðåÞtíúåE]!õ°Á¸ 8-dìT–Ý¡Ž”ž :%à|‡ ³‘¶„cEô޵ÿe¾m8°Í‘ï’lp°²Ãׇ]º>¨°ÝDâ†Þ¾¬aìÆ±c3¸”Î÷HbÄý·îœ¸pG ÑM5GXðU·¿”0k, Ãzê Y%Y±¼™xüîzö­-+æÌM¯:/ðNø–¯yùj2;æƒð*ïÀ=Q0¾®°“f‚(u‰2|ä’£ƒH¬¤.´Ù@ýð¥c š85Zõt+5Ûhzmt<ÆÉ5ò/4.ÕÒp³} ÝžŸes'¥¦reY ì–¡*8 e;ß¾LFx›´™¾õñÕµ5eM¥º’]ù‚9·J»Ñº}¶jK¦‘é[‰Ü¹Ø›¿Ûvâ°Š_êo„vEÙ(W쯜43>ä?ó©¿!S÷õ~JŽ~«:,|.ʤÛâB–ÌA5rèœ_˜{à3pÙ)úpPƒÆä¬fKËÒt–¢×«fŒ‹­ÛDÅNý"ˆ€0XKïàÔ±èNVSM“¸W§›ô™/M5ôêé?Åi÷ç˜r¨ž 5ʉ‹µ¯ZQiú€2¹:è=Ü‹€I\û3®m§ù–dtíMÆá“‘áÏ 6Åù…px†}9¿ic‹K‹K‹·¯;ŸÔBSPxöGÑ4*a ¬Žݸ)9AÀ™½åœ%ÝÎ;[Òæ‚ƒðKT½HMféš(+G™\º.RŠl°>üàßLNjÎ@BFFª!CEú“ýd(ÖZŸÑ „ƒDR®²èÙ3*-qoxZ¢³vKˆÇBH‡DHÊ6k  ‰3G—……Fkƒ7ð}ÿþ¹;' ,ùfÌ:pœí¤ Ê}ÇFYÛEh#—‚hÈ ’ y·Á˜&èâ"OŽŒœxò¢Ñ1ç¢> z½A•‘‘°¢8߆]UeM…§ï6{-ñXHµ˜%¯|5ÇàÔ:ärhÈ­&Œdúx;æ´ô”®ó<ÏA!u=I0«…HÑ]Ï1'¢“Ž¥P.j©‚«Ÿõ| €ƒ!2=^kˆn§ZQaúÏ øÉ ÜÉF€¢3ó F(ç¤óF«z~ØŸ”\ ÎÅ·?k»û9{ºF¨Õ¦§Ð@ÇS¨î }„(ÙÐÐ[ÒÕA¶%!–JŸÿœ­Ë‹/lacJ·ÖxPHFŽžN\É«_Cçó§KÍÍ*–Ÿûƒ_½Âw}B   È_§Õ¨¼IUwábv´Â‰xóVKÒ”ý„†Ûi)õ´¼û~·# üNýW ü vÒ¸V°Õ`‚ÊŒšt£b¸ž×Øž‘Rtr¾ÁKÁ‰ü?€cf¥}=_æ' …à\ Ù*é åF㑬Óac XB¶’ª!z×à›f{KÝ ŽüÇR åÅ¡=ºÛ‘*D.]¢ÝHAe@— *<§à¿¯È†ªZÝÝͧU¾mÞ…«èE÷×F{âú;NÀ 'Ÿ«¦ ³’¤(L­Ææ²ÆÒúcå"ü¹4a6Еe>}²€ÑfZ?}ˆœ\z]ú/ek`Ûw"ßN8aÔ<õòüªÑsTˆdÀwìÓëEæ|“AŸ-ìINÙZn[}ü‘òÆC'„^gA6×ã´Î»õ¸«^Ó`_wõ3|ûYö}Gžc¤6ÉMY_ï«öÓÆkÞž©ôóÏ]ïB„5o. Íók V튋‚@PW”íæø¯“¢S=w®æum1.Çל»û×U5QÂÆÊe0¢`+¤Õ9‰MT0垉¼‡,2qþãÛÃóT5E•YŦŒ4jÙ8íÁ¸#G–– dûxåfð˜!ð˜póÔ)¸ùÅà±YEE}2(hqøIÄ)ðBÓÕ+pH… Åí|T½n­H¼ÑGè_êÏW¿2l£ßYf)ó_+~Åíž÷þаýk»&_äÊ$šµ"7c£hnÈSç8¢G8ò¥ÝÿÑ©,Þ—™gÐ%„´ ¡Z ,Ýû:S;twcF—Fó-8Ç=ù€x =Öêg >È’©l ÍÔF:¾‡ºx°-PŸXYLýíb:üÚƒ9¾=èì}C¹Ë·ªH½4Y¹Æ0ƒ¼!þ؈83s¶—¥ÆÏês=êöÏÑÍžÊ4áž:òUXï zJXþÏäM _²;7©u> W-ã6Hß+[ƒë¶û…ìð÷kmj­77[Š=µ“o‰èÓ‚-²ËÐëQÛ#¹t7)á¬Š ¯s[žq ríæ‹]]_l"ŽeB¦ ¥}6½^ø]†!9EP¿U¶¡y<ÍïWßšJd‹7Ü«:ës4õéÎ'1úrmaBÖsj퟈Õt¢ªÅÑûC dÆþäu¼z½ŽÑ˜›'äççVU½·ù~‚Å º_öLõSõõkÇÁ".q£…(O)ùÒ-*z»!’Œ{3Ó3“’70Ô í¿-ÈËϽi©Ë‘úX€Hð~¡OlAeƾôÔtZ›ÉR2ÚZR³¼á·tâçš*(.|Y5Üì£Ô0¶¨àPay $îNüÜœ}Ãø¤äXê@^-®×ÇW v‰’W.n=œW mP6@°±Z£±í¶j2™™F“ñ@Nþ][Û¶¬SûM¹9™¦Ü,Û óOyäÓendstream endobj 185 0 obj << /Filter /FlateDecode /Length 218 >> stream xœ]Ánà †ï<oð¢f‘".Ý¥‡UÓº Ž©8” šöö3¦­ª>‹û·lwûÃÇ!ÅMw_eÅm:Ä´º®·‚¤g:Ǥ,è%âvWñâ³êöŸ>ÿüfÒ\@¡é£¿P÷ 0È—m&\ºfT|:“šŒqSNQZþ¥Æf˜ÃKeÀ‚ci]ÃÌKÛ;`×W9: ¯ÀYÏØ×k«7~V¸3±ìƒŒá¨&vÆ (s>&ª#×å»j¼•Bi“ Éêâ1ÑóˆyÍÕ¥õ…´m®endstream endobj 186 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1116 >> stream xœ¥RmL[e¾/·+¨¨Ëº@Æî½›Ëœ?ÆÇ¶DYHpN‚aà&Œ}¨Ë,£[i‘RZ&eúý¶··¥í(“B×IA6V0h\CÅhtYü˜‚Ê43Ó_þP|oy;çeî—ÆÆçää9OžsòœIÈ©¬ªR´5Õt47hÕº¢ÂíÕÊãzµ¢uµ·UØ„¼4a# 1·²7Ù³ÊH(“ÌæIעɇQôAzˆ 8¬1Ùý±ñ½Ú–ŽVÕñ¦6vGaáÎíÛÅ\Ì6t°O峊c'µÝI«Ð¼ÌVäWå³Ïj "¨b·i5lƒ²I¡ndµìAå¶¶¦¬º†-¯Þ_{ æ±üYño°¢µUk¸7\ÑÒÒª5*_Ñ+Ô*M£J£jëP+uº{ÀjѬ?ÖDDÆ~p‚Ø”[´. ‰V¢Ž.xGdŠöÂE\$ šÓ²ÓÆH9C²ï’y ýUáÎUðÞMá›drPh—£¼Ê°;w9ôÅÚ]ÐAYyÿÚùHŸ?Ëùú†b3Ñ Ñ×ããÃý— uû“R¼×áÍXŸÃl ’ -‹#¨ER¦¿/2ƒ”ßí'ðe¼Ïâ­_ãl´KìNˆ1Ogßòy]ß/“è â䣺˜F£Ói41Ýèh,6zŸ‚;ÚW: e%H´7ËWv§‡aÄ`€FýÇît4 ÁHXd“èT$+Dµ!#4Ñ©)©É † 3”4CLöJg°YÈj7ÚWdre¯È‡¼Ýkw³%·Hââm^¤:¤V›­—9[0Süe-uÇ)5YÌf³ßf’N铵‡‹_- zy›”ò÷ºù’,Üþ}Âëöz!OýµÑÜÜ·s—Äsqa9N&•Âù°%`1;N™]´½¼L±î‡õcåÓ/޹R{Êòõþ^ˆä~é»±ËpN7_«K{¥écÑø/®ÿÄà.ɰ%hévžêtѶꪞþo"?öù­U+ºÇ…Üq0M.EW}PËY†ÒqÞ²oÓwÑÏ|ãrë#'GL•@ S¥àLL^Çé( m¹…¶Eû™Ow»]QãxËŠH!ê(“ѯ´¬äñº†sïÖÓÚ7ê?Ò^œ¸vã7´R˳1©õreyéf,›jýñ—ë KoO¶=?ÍÄÕÓ•qÕ}ïðÆÕk~%‡g,Üi_*ŠÜ9Â9ä zû¼°?7Ôèv8¡µ›N]Áf[våÂÓA[À.ÌàœÕ½ !’ˆÑI§R“៑\['‡!+×åO9Q> stream xœu‘mLSgÇŸÛ—{+v ½âÀËÑÍiÚáXb¦É²ÉÛÂDj‘—ÌN×JRèet¬àB&I×ÓÝÜ„q+Ei·˜»lÉÞçÆ²„f/Ñ #2·Lbrnó˜¸Û¸/{Ë“ó|8ÿä÷?çübІaröV:¥V·¿ÄÛÚ¼£Ðæôíhq·§•-j£æëÔz µ©…”Ãf=˜ Ÿ¤îXпd¡kÑ3L]KW±ÔÖÕÞ|´éeññÂÂ"›MûŸ=]â»Xá>â“‚_³èö7ˆöJ»¸O jÍfq«ä=Þ&wK£(5мõbMu©³Z,wVÕ8ªµÿçhkBŒmíÎVBö“jRNŠÈ>Âj‹9An2{˜Ý+x.óžn»Lh­‚%UFñÍY‘Å:ÌÎåש£°â#öŸ©á»Ûß(|Àñ·hi¯ÑÅÂÄÞ A/MwÊ\Zd´„ŒJ–rS™×fÁ„·Äí4;‡ŠuµÏn‰Ou xšã³“ç'/å}<÷Í*ȼÇLE@Áù$(RRó'‹˜™Ë;ÔͪÁú™ãìÁÜg;„ðM–Ó]i÷˃ÐP@/ßw…o!Ú <åùÊ0— ó˜ß3ŒÇ§Çç¿CNóWlK2¿"ù-zu“š²¾ßt©ø±ÍÊ ïw}AWÿ \]V¶ÞæpÍO‘˜…pTèéë>/™^œé<;5=~QcëPI³IL(ÌÆü«˜F[.¿œ ­X'º¡§«¿ïÕ°Ð8Ø. ú>ïý&4ñú‡aùø× ÉÚ çÖä§ó ®n»FŸèu×ÊÝ%›‹‘oÀœönÀLȤØ0qƒ)8ãóA*a/ôvÄw¡¾çK0ývr%V@ßS·YË ”nvc‚å—¯²üæAy‰vbý35é1‡• 鈗µˆwÞ¯\þZj!GKm˜»øŽêK6Ôµ ¿ì–}P õ•)üËÿNŸþ×áÿŠÛË¡þ壑±E}·B“²d\ÿ¿’1óxLu¼‡Æß‰±JnZ+dHæ5`^{NŽFÞŒF‡æGÌfe rqhàÔÉ·"±¨ùBþPþ˜ endstream endobj 188 0 obj << /Filter /FlateDecode /Length 640 >> stream xœ]”=nÛ@„{‚7É}?6 lc7.I.@QKC…)B–‹Ü>3#;EŠ!0¹o¾yÀîŸ^ž_Öó­Ûÿ¸^æ_íÖ-çõtmï—ëܺc{=¯»aìNçùöéôœß¦m·ú6m¿ÿl­Ã m¹ûïÓ[ÛÿíA? ÷æË©½oÓÜ®ÓúÚv‡¾¯‡e©»¶žþû+óþÅqù|uÀ«ÔØs…ª{¢õ*ÁÚ¨¬Ñ«´1v®ì@{ªìHÛªˣƬwõÃ#íC•úOØÇ*Áê_œJÁ2äˆS)X†q*Û` h¨¾/LU@CÁ2U«ËT¥T –©ŠU –€è¬Ó‚ Zħ`“ñ‹  â!"”©J°íR%Xìé`h i ih i ih i ih i ih i ih i ih i ih i ih i ih i iØ-{¤ÅL[0nÁ°ÓŒ[0lÀ´ã p&@# c!®¥8—â€s:p.@' ÎètÀ¹€8 Ðçt:⻜RCÅ‹ Ì Í Î Ì Í Î Ì Í Î Ì Í Î Ì Í Î Ì Í Î ”*6Xl ÔP±Áb‰B©B©Pj¨Ø`±RCÅ‹ ”*6Xl ÔP±Áb¥†Š ›(5Ul²ØkŠ7É›`Mñ&y¬)Þ$o‚5Å›äM°¦x“¼ Öo’7ÁšâMò&XS¼IÞkŠ7É›`Mñ&y†4 j´ð’/ž¼¤¾n#ÞW¼ù¾.ºnþ¸^ÛzÓõ¨ë·ÞymÿnÐí²ñ«Úý¨éL¨endstream endobj 189 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7705 >> stream xœ­zw\çÚö, ;cWÆ•E<³Øb7ö’è±Æ®(ˆ]Þ»ˆÀR–½w—ÞëÒÁÞ£±ÅDI4‰¨ jÞÄ’˜˜gðá=ï÷̢ƜxrÎ÷~ßü1Ìî<÷u_÷u_÷=J(s3J"‘X®Xiàçì?qÂ8{70_ç`ñê;‚Dd&üMêŠ /ÔñÐS =ÍOq×Rx¿*ëƒÖô¥¤ÉzÏ ‘Á^ž¡¶“&L˜!>^¶Îþ;l—_9ÞvU@¹èe;2ÀßÖÅÍÓÙ×Ý6ÀÝv­Û[G‡ìlÛÛ9®v5þOçz}¢¨•óüç,Ü´0èƒàE!‹C—„- _á¼|§ËŠHו»v¬r³s_íáiïåà½ÖÇÑwßú‰&Mž2µß´é3f¾7¢ïÈ9£:ÛýÛ8ùø 6E ¡ì¨¡Ôjjµ†zŸNÙSïPÔj-5’r¤FQë¨ÑÔzj µšO¥6R ¨qÔ&j!5žÚL}@½K-¢&P‹©‰Ôj)5™ZFM¡–SS©Ô4j%5ZEÍ ,©Š¥úSrjAYQ ÊšHÙP åEu£l©îÔ]êåGõ¢ü©ÞTÕ‡ê'é.éA­"Y¢Ì©Hê¹$Arßl«ÙCé|é~ó!æE=,´²÷dŸÒÃè3Ìpf'óc7çîýºWöXÓSÑÓØË¬W^¯ŽÞ½õÙÕ§£ï޾‡ú éWh©c{°—ûìÿ|¹üÌ·w¬l¬ôŠYŠX/±Þjýù@¯§môƒz ÊôßSs¶ÜF®B9Tgki0¸ÛàëC|†ì:sèš¡îC“‡I†žê{wÄ6òÂÖI‡ó>’¶ƒè U=öí°P$å¥dDAhÔIÑØµóEä×ÝŽZÆ—þÙ€hOo ®¬2è²uzåade@v Ó%ëÕlíçœ/Ýh¸û€ÁýQ–‡É9ºeÑûÌÆ(à ^e´DfW‘ÛU+¶V¨ÀÓë!´{ä@Ã=à}£‹¼K×À|ز=`%ó+Í^ŃU¾ôµÌÄMJ\FoSÁòda@æâ–¨à­ ÙÚ_®xùRŽ£=‡£ß¸K|öYGòltňšyK¤lCçÍjÅêP¢årøvæXšû¨äêeøœùöÝÛx×iæ[!»©Wy(;+hÕß¹_aŒ EÖ÷ÛÿK‰û¢;ò囦c)‡‡#­¬^Ÿq„C}eìÍG ÓÖ)+p›|áú™Ã8ÜO¶%%£^‰ªÐjš5Ò:~‰²· QU Œ’š6´§M*ø o9ê?â9î…ûÆÜ˃º¡^?=F,7#Sàæ¶ÍÉ#l§²ÀÃÁá4B3œ®8X}øHÙ~8ª¶Wm‡5àÆx¯Ï ÂøŽq¼äÃgBàiÇ8-φŒ¨ã´\j;K€Y…7ìE'ÐI´~ï$iŸ€ß)Uê£A“L!Ê”(Ž.‚ Ur2Ä&pç¹7n8>¬±žŠ'ãíØMÃÑ*4ý1R"FÙ•c¼ŽGc‚5]iùü**l³bû ÅÈWŽØÑO°ùlg§°î Í>ÂÃĬ^ÏP;);=_çËÜ€,~Ïê,:‹N‹juüÔã—ÇH®œ1÷ú`úÚÄ£§²‹p5ìÄ«³¦Âl1›}οBut¥do*¼**ð:ùK”„³a´Û„˜—Kï“ä0CFã¸ß£ws­å@­Q‰¿®…/úZ>‘a!1Ñ>[€™¿ªѨǵ¶Ï¿n²N„®V,Ttž¿Ç£é$ÈAíhS%Si¨”vØ¢‚c0:Ï%8Z¿äwé}úQŽÏ4e%*–MUùŽæ&¢Ä—e!—¡qP½¶+™JY ³è<ÿŸ²×ø|N•$ó¯%âù•ç÷¬X[úÉë|k·Ï÷X²=šCf¢(ß&2Ã~8û5Ö|8=/%§Q‰ÆÓìÈ'­í_fèA«ç4ÚˆXbÊv‹+së8¨î¼è&ª0¨Ýµý«öàJ4´ÒŠm~6ËM‡=üçÃÊX¡á4Û´ÀhÔ0¼7ÍÚ…¼%ÒÞ£Ì~Äô8ï1ÜT”.cGuAÑS†FC¥C!æHZ%Ú JeÔ—ƒK,ë"—£¡G­Ø¨õ—Ã)¿=±¹Þu;23r–äÁ9¦¡ªå2K›è«çtñ9ÀäAZ‰ò'S&¥@l §IŽ‹OÖ¸Õ¸Àn’šÞnK< ªÃ”uA5êÏ¢ö†1ùvÔ‚<]gO÷8{w'§ÉӦƉ‘J¬ wAbNšNWRÂéõ /.9è|H[Fê€>üÉg„Ò¾Gˆ¨ h^nÒ•iíÒŽ”DXˆ{k\ax¬}ëèû•»r9Í1° oj0 ÌÆúó¿=˜ˆG”r¡/>uާG ¯ÂÓð$ìŒÑ<Ùßøºê£½Ê¼°ý®9ÀdAfͧ›SÓ>&9”$~G©*Ñû(G+",¹J28dðº‹úÊϯ¥çù¹¹/EâÑP[Å”`™v¦Ÿí¨d&Œfù»¸V†û|Ûx½æúe®«?^äÑÞ.òŸ$qnÀ‡ÐY%TÐúœ›\/óÔÌ7ò3< Œomb ŽÁ'QÌ_ßó»,È Ÿ“^¹¾€£—Ï@è$.xû=]"«2ªø£<:Àû¶¾n¦ËLÍôƒ„ŒcJ„höñ{™,¢§l^<zò‘“ÛÝ¥Ù–®¿ÞÍ$%Mφ hì‡k.Öri‚ª× W7¨]Šî àƒèYš—Ñr¾âªÄÈf‘¸vÀ,SdUôW†—‘iT³¸ ñÔ_‘37ÃW/OMD,;\x——”ÑR!MFˆšâ¯ …)…/Ý¤Í …Ÿ’œ¬Ž3ØÕ©ó ÀºªŠ9Â2‰&\u~zk_ú¤ªó|Ñ0ŒéÑú¤< wf¥f#+tK‘U^tàŠN|¤ä;*ÌÈÜ™‡…pÞ²™/Gæ?aÙ(¸uØŠÔ•kœa2¸ê6Ò!ÆSÙ¹…~w£Ã:Ž¢†ÅàqŽa‡ÌÝSÕP d†yE;)Y˜wÝ®ýç×¾Èát™ ‡½Œ°šnɇK\Wï%Jø^RÜ1OÚá` 5Œ„ãÅPµÆHð5¤$ÅLÀYŠ‘¨.9W«‡4ëêf(%‘ÕøW MP˜’“¦ÎñËØ9')Æ¢Ò¤\òÄÔW÷TÆU§C®&×Yâßiц}zZþO¨Qñ3nJU‰—¬óÀ ¢Ô }£(>Îç5”ˆ1îâQáý£F˺›Èõê R<1BD»üÃ`zM°Zå|(C[hh…f¦Í 73sÑ–¥~¥»ªjŠK«r“ê·ê”Õ Çrê€9vvÇ$¥;½Aóf…ß\¯àõàݪ÷_ºrxÿ‘ŽïšZí|ĦìBþ7Jüþ 9«»ÀkÛ&—†ãgZÛÐÌt¡´Ûù7è×Jhíá©~qú^– y™™§N|£³æé ‡d^„…ô~mz(ÄCT\\B"¾‚O*ÐõÿÇR\@#™¡¥¸,=>+b­ýv·àK7t™Ü.boj˜À[æ :+V#ä‘#³«!RZ‹¢yŠ=ûö«¨â[ Žèrì?møÁ:}ŒŽ›µ-KÉŒ‰H“¤^9[1û§øl’åtk((È*Õ1lÉ4¥ ‡-º@‘×@§=b÷Ë[ì e‹ýæ5«SÂ|S•ž×UÁyþÜ0Cb^Á@0ÖÖ_øìËŠLU^a]|üî@-ÃjHϤ ÕЬݓbýJU.´¢ŒÈ½•´ß¥mHO¼Û‘—ÞmÔ,›½}Kd‡®Ñ]ÖÍ$-ßWÒ B[7~Ö¯<šNî)vþÛÂ}ݼaÝ·GEH±k(f % Ë)lþðLf‚Æ  ·*ƒ=¸0½;,”¤—-5>~,|e2ªáÑÄ/$ô“±ºLÓz/äÿÀÕó2v¤Æc¸Øì€Ù/3ÌÞøgV,{i§œÅwÀ(8ñ–%wÈ ðg=âµ…»È\§MIŠ}kXŠŒÉÙ)©¤òªš äŸôè( (ßî”(‚W‡­ X´¬Ù›I@$­˜OÍ4B!Sµ³04",Æo[«ÇñK-gÏVph¡0§êÒ ]!ü%Ç‚ÄFVÿ°ÉdñÖ?” “Qyvhˆ&ªS8ÿñËbÝY7ùšŠ¦ßn=•uIëÑ tѨý † *ލ©*-Úóéœæ¿ã~ïb ÷ÅýŸŒ$ÜX‡zf‹E•Å¿**ÛTPƒâ¾‘¾¾¥¯áÙ² mb$è<¯À~ÂÙx£†Dbg¿¶B:¶ mW7ê&úõap¤Z)4êh¤þo³´˜4Â_ë0d¦æ mG/…®óºìU¡5>%}¡>&±3ˆ‘C¥ÐŸLDB7©0Ù‘LÇãîáN˜!>¦» ñBϬ“èå%@$‡o«>•XõôŸKšq(2®ë쯂H²ŽÎ éAm²ß;å‡<:CX-6KmÉ+ÖM¨xÕ+…_h¶ð Bc_Ú¿q{•£øè!£°³G"ÙåC{ë*•KIQ!¹9DBŠjÃ6oö۶݆»*d_P‹æ,´@“þ|í¡2~_ýih€ÖÝü¶œ]äT‘ŒÉUtIZ0³†XŠ®þÓMƒ»‰úý ¶*;çÐø¹PŸ«Õí$xÿÝ·VV¥Úm¹F§…LgÉ¿À½ˆNKÒiSÕÂØÎGЬX6˜|È(Q Çèj8òŒ{M0¿24ß4{Æ_yɰ}R|Š:!…ó6â`#¸î mò; W ‘Au2£Êž8>"uǼ;Œüøëh2/ô>„¤%Ê¥ÈZŽãdéhÔʽÀ<ËÆ6;”]úVÕ1£R´‰NϤnè¡mÇcȼ¸ /ÆãðìBÜÝx<-BËÐ4mã†åËq1þÛôwÇàß¡|”‹Þù´í[4t!Î?ñåúM¹“i” ó+¿•¢ŽŽ>ò&÷úuL[7˜Ãô,߯ðÍ¿˜¾@2wC ýÝÑ£ XÀÅ&GÆ@0ZQ][PZÁ½žöU¡K¼eÃ3¸gx†žY±¿u˜ jùã‘ßá¿qøùŸG¼Ñ@âÑlõDÔ7O•ÃlR™“9Ös¨¼k>j—¡É0x“¸À.åÈþÜ¡òÂrå±å–hòä˾°bi•)Œ”ÅÖíˆpR»8s,VÕ;;ÂlÆ/Zôw'£[e¸2fw¤7x‚oža·Ëg;¸2 ž¬E½Q÷_NÜjˆ>±¡†[W³VQÛ‰:ŸÔpꈿ*/*mhÑ”óýÕ«7›¢š‚Ë•{ÓŠ‰n[©2À U%'© –Ù•[˜]’QÎá…˜’C ÖgwpBlh€+0Sàiyµ®® RÉ^Våf–×ì·ùF„*‘Yg¹ã£ÞYtâÔá}M ÜG²{Ȧ*_¯„¬_Öæ+#{ã/¶BÓÁÉ.ʃѢŸd¯6]m¨è_î…þõVèî Ñòè”ìJ5<—t~'O‡œÄ'j9õBÏÈ`Ø '¢¿ùZyySýÚ’G·.À-æG,»ƒGpø“7ØÀú¿âC£áºIç®›fÄW|HG4]H¼Tƒ×>ð…%° \[Üö„GËõ›[E·k”8L˜,_òÉ‘¾“+ƒrÈ5²õµP Ì}džŒ‡ø$òó]%áÛŠ$Ï-ïþöQ¶J¼¥ÉiÍJAJ³g±­ˆÑÇYj¢lÆ×ñ› !e¯ÖšU¬~’W‡VùyE–íÙ[ZSÉuå†L{ðhGïÕH>¼üÉe´â²THF«äðtéí饸?¯XY°ã4™O¯¾p ½oÄ3¶¥s:5¨s^¨h«iÄKÔjc9O{¿Z—–IDÚ¤Ó'žqjþ­@eNò‰Øk»ª÷$Ö¸—e{ƒ7³pã‚éþsÒŽ­ãÖœÖ\Ö6j³@ójNÝbšS3túœ ÀZŠ÷ºìÑNº@·¯#3e—T_øbÆõá‰ß–h~@î傊ÆcEHnf‰´±¥·ÅO]ž yA\Aji>T3U‘¥‘Aë? 8ûÅÅË8¶Çó·ADœ>ÁU8ZÇK+Qf;ʬ”vÌ6ÈwŠ›$ÛiÚ(壩õh Cd§”%ƒ BÂ/ˆ¹úÊZ ?Ãaòó ZO\é!¿WìÇ$ÙùÅ©9újb.ÈÇ ¼óñÔ׆ST ±jž_ùâJ3‰®MÈ$‰w‡0p;…Y´X¡Õ'¥¿•zý|v業ú2Ñxúkb €øå•úhÑx–h³UѱÄ/ƽB(Í6¼½®$döº®žÑ—ÏÜÜê‘Ö;w%ïäLf²jµµÄLvćñÂEþH×ü<³ýÿºÝu×à¯Û~Jã!£ß»w¯DöœÐïßxõ^4ŒL¾Ñ÷¿G²"ÎP Y°ŸA7èz8dêrò—£ƒ¨'RKaéÚ“ýC\½56)уŽxmxÇ42Ÿvl–vø›Žë›âJl:–‰†ð¤¶,ˆ¸ :E—w†+°ƒ Wç›&ÔÚ³PI¡‡f93fÅÛ?¡ÚÝùB‘±3M“E OKËG!Â]E~Suí§â„*çøO;q“ë8ý—¸Ë-úÛy9ÛÞX‘ó®È½] ÿCÁ4—ž§´áÂc>˜oä-‹_„X±^¨MHù¥øjý€ä–„þ‰¶Ô›ŒòjMAjt§‹Ob´©)édÂÝsªLH-‘ê-ÞÎÎ8 eëaü@•óðTA¥5cxëͧ¾€Ô¤\w´¥³Caˆ7ÄåA>è3RóÐL!MÞëLïºhÝu•ag áNñÙÙÍÄe ‚v9B‚?— Óð>ôDMN“R8GW€>”[¹|2øˆsT)|'«˜Îòô؉œØÝ¿…ýäç[Ó>ãÅnD\¼ˆ’¾ˆB™rã?¢Âhñëo>º‰ýúoyü×Ç¿Â+ö…àˆæC›ä—è·;1a))P/‘=†& îüixjd¿Æ½±Å¼w'9CQCnKUd•gB h5\ùǧ›ÎóàÀ{3•ìÇðþÆYkWâµØ[¡Ýn#Ð2òܰšëÄê+GݺX)Aãù‘ [Ñ9Ü^qkhÙíês×à+æöäǼ3ÇnŽ·qg-_j¬=¾vsü±+yÀ´œ ››²&ÈIé·ÙK¬MІ¤$B‚6Q qŒ*Џƒ²ÛM‹GáA‹ü¶Ï-úÈSÙÄaÓXêâí4áû¥H‚z?xð3g‚ ä…0‚õ©ëâkŽ™r~„°™ ›¯~ø|§—…/*™":¨y\¸¨„'Igl…S&%|éÚ¾¥òr¬‘!ÐÍÂ+2{<¦ m4"«¶Ô„ –ÇŸ„·O{‚äíVlÿ¾ó­rÔcæSLmÞåéÁ¡õ4Ë”©KëëlPŸkòÒ5i‰J¶¤±$i"â7E,!~ÇŒr…­[Ê É↕Ý72¢”ø ùzCz*—SØtú8 •[3# Ýõ;ˆaö»çîA[IIÚŸÚõÃΫ5´96õE•»*½£=·*Ù2ÅÔ«£‘9b~þ±#_áîs ZaDsRä"Ü“Ÿ9´Ý320(¨(°±4?;ôR½^GŽúèdŸÄ+V*ccIÞ5LbZrZNÛ—¨;‡Ö øß|Ì„¤0¤¼íÁþJËÖûhÞý€ûVl'áÌv2îOúK»oØÁUÐIJôm4õAýò^~O²A7q1fWs°Y,–’F=;÷:ƒ-Îã>÷–e“žjÈÝéMâŸÿŽŽ<ØüàS£å‡Ëžoznÿг͊G “…Oäç\oâQ˜Z¹xÇšëU].®Y9C4ÇŸ:WÐJØ/Å;”ìv¬ŽŠŒŒ\º ì]XÅl#2¥Î̓¬b®dùèzCÃÆÏ­.-klˆm;óÿœÌ?„‹¢H¼­È ‡[*Ôk-²°C}¦~Œ:9Y­”’Håã‘gñdÀ¤Ïq'c`_lÓ•AujrzöýOûw™å")ÜùóË Dÿ ·Gß< FgÉÜ?¾³hžû¯^Zt§Ä·ÍÔ_¼¶`-TxœÐ)¯/ô  . ­æ‹+Ë9´hÀŸ®½¹÷F’,ën¦’3-0m¿ÃOýÿ^Soì¿çÎýçx¢êŸ6àlj° ùùý?V ¶½Q|qІ_â|Ϙv\]ÎWJcËø(­XÖ)Úˆ·[ÈBÆv>¹·ÿâžÆ¸ÐRÎ%EQŒwULIyyážÖ¶Î{lÀËþ¸X‘ôwÃxM¢gĸ(qùü´IðÜ.EXJ ÙI'¿ÒâúJ òÓ³s8ý¬€UN[Ôj­’M*ûÕWˆþCXÉ|˜),Ô£7‚úí¡N­.Yoí“ïB¦*f–8 Uþ»ãzüáoÞÂ\9öÁèûý—‡?çØYP 5ññÉQq‘™»‹Ôâšr¥#…ìÎIrP±Õ";ù9\¼Fô|&#($‹s11‚Éaô+í’ÐSo):ÒŒ £¤¹ e¶I…í膾NúÚóó­?Î,t;˜ä2ÞgQÒlxæ¦Nl™sརrYvð‡º«i·ˆ—›‘+'óÑbÕòÝcíý¶ÁX]ù£êÔa#ß‘–UœÄà"ãè§ß6TÑPÍõ3 ŠNºQÆw¿Úƒën¾v­SÏnг‡Q§»f†^o¸Ð³ge‹!]Ÿn0ÒÒS{ö¢¨ÿá‡.ðendstream endobj 190 0 obj << /Filter /FlateDecode /Length 308 >> stream xœ]’1nÃ0 EwŸB7°lKT ZÒ%C‹¢í™ “îëÊeÓ¥ëRe—Sá¿ÿb™©2Põ ÿ.™-endstream endobj 191 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2552 >> stream xœ]V Pgîa˜îF “ÐØ3¸ŠhÀȘ5‰Q<ñY£tÁAq@”cfæÍ¡ ·" ‘á²uQñŒÁh’5«[k0ëÆGsç5ùM¹hö¨WÕ]ýWõÿþïxïý2ÊÓƒ’Éd~‹—ÄèÓ“2¦„ǬK1è’6 ,†ˆ#eâsâ(9Gÿý~³|äàãyæ9oÆ+ý0e(¾1Œ’Ëdo¥ègë3s7¥¦¬ß¬ÖLš49<\zNS¯ÉUGNT/LZ»AŸ“µ!U”¡U/œ¸d¢ú }Ž´˜ªÕg¨×¬[Ÿ¤KVë“ÕK×-WÇÅΉUωŽ{3vüÄÿ?ÖÓoŠ¢–ëçnÚ¼fñZíºè¥šÉ/¾ôò¸Ðña“(jõ&BÅRqÔl*œšCÍ¥æQ“¨—(JI=KqÔp*b)/jõ åGJPžÔÙdnQ÷åsä]ž¯x¶)E±â*EÍD2ß³ñl-û¥×D¯t¯O±Í÷‘ÜE v Í‚¬ÿöpÁÀ,‚¼òÜ}ð£@|Wî~¿ª‚F[¢µj!f: l¬–9l­5ÀV0–XÌF@¦’ STfµƒ3¨æ@u;/0DcY ‹í™ö m#óÔ˜÷faÙHb‰É OY?Τe‡`à4\)Ùme&ÑVpj Âá,¯Ä©˜ˆQd‹Ë€ (0$[¥Ü¨qž€K¥Í¥A¾<ÖŽ Lb[v¢¯÷ÉÅ0•C?â‰KBˆœPÄø¢"ÇH¡ø}ù°rn%ñd ™8þD+\é:·w­='àX^[rçXX‰Q¢t ˜+½ýñõo1· §uYº”ÙÆþjÜË%Ó™d¢>’ÄKfÐñàjU¡ )æ»úÌU6%Ó9™!<¡0—n×I_¢•K(œ+÷’¶‹Öa¾â·m} ÓT]L¾Âo¤•F£¶?”ñ}$»•+ÿ„Š‚ÿ…^èÅaÿ PÎç‰ÞÜáuM ÑËSèxë´²‹q Ÿ¨¥Ï9?ƒóR|ç,O7»ƒ÷º-È®"…ßÉÅŒ–œ^šoŠÊ3î(šù’¢i|öÇöæÛ—[(Û”[ZRhæÉ·W)´xù•2™ÏÐÒÒ¨AE!d0/CU›ê3UàH -øHñ¸Èºqè]pûc€ð½€JÉ@:‰ôUÒ/üH¸…+²37ð¸˜i3wXÚ¡QRëRÇžŠ@«¼YmrXJ¬`1ò)ùËóJ6®|õ“Ób·›Æm*r†Ù …uå§«Œ?à~·ý3`q( ´%±ikTºu«¶%Â<˜w(ëÂIÛ.ªØæìý:sRñŠþ9ýq²_£ßS²Å«wÜ’Õ R³ºÞÈ‘Jz dÙ´ŽxG¡­x?›L§½dxGCŵ•®]· VÊ—MkÔˆ×|2HXVž8 ïUó- àÒ#ßt÷ ß ,¯šp‹dCYÂuJ›ËÐG†™n9î{¹OtÇVk³3tº† a÷žU•^àãí¶Ùm›½ÌfwõøøtÙ;mÎ2›³Ü^áó EýÉW]endstream endobj 192 0 obj << /Filter /FlateDecode /Length 249 >> stream xœ]‘;nÃ0 @wB70m'’ƒK²dhQ´½€-Q‡È‚â ½}I:éÐáxæG Ýœ.çK^6Û|Ô5|ÑfÓ’c¥ûú¨ìL×%›¶³q ÛÓ4†ÛTLsz›Ê÷O!Ë”vŸnÔ|vý ŸÚ½)¬‘îe T§|%3à˜Êñ_ª=ìsz–v*ÐÏG4c?£ÐÑ€ @¯Qál%T8K¬‡ G3ºެGTXå!Ç…N‹{TX½(Ou:ÙÉdÏûYyª×É^&ûÖAw~-'ëË!_w³áQ+åM¯­×”#.™þ~HY‹tYÆü;ø~bendstream endobj 193 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2151 >> stream xœm•yp÷ÇW– 1`2Q#MaW L ”´Ú€! L0|0ŒO$ÙHÆ’ɇd+?Ý’uák}ã0„Ø\†›&5LÒI¦™¤L  i3ídÆù­YOÓŸI:“NûÇþþx»ó{Ÿ÷}ß÷V@ÄÇàù7SSsµò=ÚÜEþK›6dž(/É-›µ†û©€[Ç­óîYó¬i$!!þÆŠE’gQd9Ò-CòD"^ 8x²Ú´S]ª+Sœke¿Ú´é×6àóeYžN¶c£lon~±ºRS¬åª d{7¦n”íSWâ B–¤VÉò å¹%E2u‘,«ðì@æë™²”ŒýÒ2×müÿtÿ-,Õ(JÔ*‚ –©JOíÊ­*,:±%yûÖm/Ä~"È Ö;ˆlb‘Bì&–+ šXB$ ˆD,O\Xãdqß £ññ·‹–Š~)2ˆî,|~aÚ¢¥ßÅJ&Œ,· '“±„܇h•¸ÑL=056ª2E™yH½¥±½3Ødé–ñ‹(n‘wŽì|éðZ=e{7¯ï(…ª‚z]µ¢6 ìd} Ñéd}TÓtëåa [CuÊ ÆXwNç«™«lR]Ô 7Zý”Óóu²%>ÖÇzÛ#W%±¾ñ¿~ä;Á"eêaþ¹êã´IÛ`#ùû!ùØã³hM€ZúÉþ­>´þ)>·ùž«CCâÇS¯d9Q ¤êoo+zJfÒéuûù_²¦¨¹PËízšŸK7+–ŒPeöÚݽnè¡`éÒÖP=Ôfƒ?¾ˆ~ëï¤#ªù5 ‰–£5h-Í/ã“ÅŠ×(‹€ÜS÷¹ÀãÓWÐ!wwOsL:Ô×ëor¤Cž–¦äê i\Å5Ū™rÏñ;Ä8QõœÈïò¹‚¢¸ñÆg1æç«ôTù‚ÓÅ@ò‹q¾$~õº‰ÔÞ>ß1‘_˯Ùpsϧ­W=Ó“t wHy† ½ýtÓpä}\/C¯Š³ùC68jôÒœ¬¼j5Ùµ7Ï_íÇ £tßÄ;gGæ5ÙjuXlóÂoµcÄÈ”û  z¡;„œåR“ÃnqPJYŠ{  º &D+}]íî‚Ô ÐV§¶U–†¬Uu³ýÍ#×Ó¢Štù[ZU6u Qäª ^\6?·+è¢g¦:l2¥—èwñ2º:Už›VܬŠH§—mƒ²»ãæ1ùÏr/°‚î ÑÜn1riNŸË þ§æª/µœ°csÉ»ò±oDØ\2þçI·ÓîMŒ…igƒ’—ØMФŸ´ ”NuðL0ÔMäicKiy±.?ïlåßÐò{ŸNƨ^î'â#|¦õ”¶¬¼JZ¡+Ñá–g×\Áƒ¾¸ûÝ}åí‘‹@NE·ØlØtöy%Å“ÌîÏQÖ¸¸WÓ¡Ri4*U‡¦··££× \t›øœCÂÙ½•bY¼ß‹œaŸß !iÈ42°ÔQs×ø¨Ñf¶A †€-dãp@±àñ2 †èß‡Û a³×軆¢’:?Y &“ÑäµF-4ÇòÎ9üÔZlV0IASÈí„âðç!oÀ aé÷üü«èÀŒía…(Ç)ž*;_ ¬,S—¶žG<ÁFÊír9ñP‚«¡ö5ù~¥’6Ÿ.‹×î ýù´ˆZÊ1¼®âIM¥€K›U‰çK²X+CñÿøWª­ï-xJqû›|úêÉv¼V½8ˆ ¦Ó‰òQ”ÎFY´bTÀ-ùLì³y¬6ÆÎ8¨Z­¦ˆOrßæØô`Ïøí3ô@m/žT²ë&ôuÈÝ…r‡¾ˆÖ†õ-ÐMÞþzøáéaPP!³Ëá2D[öKáòÄîWŽ—y:MYœ Gɽ·öÍ É»_ƨõh³¸Æâh(ÄûÕUÞö@›³ :ÁÓÐl#—–³ÜÎP(‚N²"vñä3Ôâø¬¬œ„Eð ët¹ÝA×é¨3æLHètb•|ø¯ìs%,!ˆÉ‹tXendstream endobj 194 0 obj << /Filter /FlateDecode /Length 341 >> stream xœ]’Anƒ@ E÷œ‚00d&‘"o’M­ª¶€ÁD,ˆEoßïOÒEßÒcÛãât9_ÆaÍ‹eJ_ºæý0v‹Þ§Ç’4oõ:ŒYYåÝÖ'1¦[3gÅé­™¿fÍñƒö¿77->«ºæ§r»”¦Nïs“tiÆ«fGçäØ÷’éØý;ªÛ¶þZ•B9‡¬d“+;ýP8Ý„ [¡€-ÐÃÕä"Y=3{Ëì‘Õ¬ ½P@o„Ã(0¢Ï2¼•áQ‚gÞÊðPÀư h-ìT(W%ËvB9‡„g oà)<}ƒù˜3 I(`2„I Q0£P {¡€x‰cÄ`"‡m8“ˆœF´iÄZ(`mˆ^#ûÖoDÖȺÄG}½ž½¯mÊk1òôXW®×Ŷdõoãæi¶[9”ý\_®ïendstream endobj 195 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3048 >> stream xœ– TSWºÇOÉ9‚’霤S§ÕZ)HmÕÖ«¨UÛB‘—Õª¼y…ðáäD"HˆDŠ/˜ÁV±UÖP§SuŸ½j[[µ£Ìw˜Íº½'µufîtîºë®½Ö^ëì½Ï·¿ýû¾ï¿·ˆ²·£D"‘«@prbT’÷¼à˜íé Q*Ûè ¼§ˆÖŽÿ•ˆabxb§œÄàd?üìÔ®Ø9•.4‹DïǦ¬HVjTqÛcÓó½½}çÍúEŠhb¹—â¨-ñÉêÔø8ETÒVÅ;^^Š÷’ÕÂ`œbvr’":&6*a›"y›"4f½",ä­àÅêàÀ°µ!s¼þů§Eý*)Y©Jˌٶ=.!Ñg¾ï¯_{ý¹…‹‡/É›=g®° ZKQ!TµZE­¦ÖPïPÔ{”+%£ž¡Ô”åNÙQÔLʓʣ8*ŸšB9PNÔtЍPö”–º%J]±ó¶Cq´ø¼ý d¦dT" ”ŽÐéËÌVæÜfJ¥Ã\‡­%Ÿ9º:*G8§zìrþÁn®+/±jM®h7†1cn²¾s†•~T ;À` 7ÁšÐkÜÑËaSdró˜–‘ç´’ú³š¢䤅×Â.F‰íË$VzŽÊÑŸ–u<ºðѹO÷„s$÷VIœù2­…÷6‰ö_Ã×Ä|<î`ñ™ÇÉT2ý%""Ó ûh.NÁ©¿C·°†…í–‘‘´"!¢EyL5g¡Ãpë@û±ã-}0¦·E¶EBÄ0ONGÖYñeïa͵¸Žaã57Ù4~&°({é>±_‘®æFiÙ·d–í<ª‹#䓱O=µ7 äïçy“ÞMWf÷‡]}‡¬|á 2õ­×ý¶Ä4Qr¹-PÍ ¦Ò²g†:Nv y~~Ö—HäÎ?ˆJ­O9Žßt“)xŠŸÎv&tD.ß¾&2—C;Sù/1•úà8ô•yX3h¿ò=Ýrô¢e³ï÷ÿçÅj=èô\™N)LrKŽiŸ¥®“¶+ú’ÒZð 5ZÑ_íúhLeÁ™7ÙßðNc?V…Ò~‰1ÛÖÀ#‡V|ÞJž·ÅêU•T·(Q1§”I§eÖ¤CJ\¾Êï¾°ÿÂ9Á¨Ëˆp°âˆÐ¹Öñn²2¾^HÙÚ0ÐèÓ:ÈLôs?ÐÛ{²µÍÚ}¤áxc¥SÊu)ëôyL-S´”×äeτ삼’â€%îKî¬=Ty@CÃîæ FVo¥ U–›*”zTèŽÞ'¬û¦@(ß¼1hmy–ÚôÖŠ6ø¦Ì]ØYº¡¨¾a&˜:ºÎþáâ‹î5Úúl(†;s”:FV& ¤ ípXw ÜC`s2ÅÆ&±—ÿ˜|;Gż/:²µ…ú’åÅ…å\ì,(€ °å@ZOâ …n;¥&´ÜûVHLæ•YB?óñKH£óQ7ÉßF–H«pÎuËA`þRK<·Ú¢îóSuá«×kL"´½{KŒ.l϶®uo½¶î9ŽÐo&ü‰\ú_býJ­d 2ô—'N  ¨Ë/ÕäŠIkT·w44·rB-‘h3Ÿ>jn4#˜óÍ®èûÍMFky ?›5æwnUGGGq2¢íŠŠ2¤{z­Zõ¦K†ÆªÌŠ„-ÌŠû¡èŒ†.ÊZ¿Ÿ[·?Þ$!Š*âweX¡vÙØ|8ùHY0_]êÉîQ™åÝ»+÷#sÓTƒA§--ÑB>“UŸßXÛTmæÈJB± ÔÅç¨ óÓ’·ó*<0·Wt6Xä²sÚºóþ>Ï[ðbší&Ù°•æ¼°jèwÇz{ ÜéM´‡6´ìÈ´ ý(w½ñ×Å£n2 ‚Žo—V–óbZö1QØÊéüîb¡œLOÛÁ¡òƒ:™{(ÿmOkKŒS'«”æ”›÷[¸ŸOˆã®( ÷`ÍŒŸ4€ÿ/[ÎzZ§“Ƨ†Å‚ªý ö ûŠú£¨žœþ·¢ú:DfÅäÞòÛþûçÿ£ÀžüeýçUÿ^„_{¬çÔ"TþQÌ¿>ÃOû”íé‘ó§éVЧqïúB¼­Þšá ü¶™l ·—åûpñ ÒC†[Ð'´[p¨Œ±Yºôí%\õø¡ÕuðñwᎠ6|.gUÒ’Ä¢ˆ‚œ¢Â·!²F:þôFndx Ôç q&¿Wæ‡ ‚Áx¨îH›¦-¶°teœùüpÏi`î|¸x‘\vÞØðfh %;ܵZ(‡T†§¥Â¾éû/ ƒ³Ìèðð‹½î‚ÐÄüf\ÊÂUÿËÏ·\m?ýü‰¹êûÑÜ–.ÝaÊì°6›:7Ag=9Zß Ì‘Sé>ùåA)òÄqe*]¡.µ¼ uE:(`´Õ`ä¤W{VÏ!Ï®JŠˆ\f<+?Tb5A/Ó­lNJÏðþêm¡ó;ß å˜Àß¡¿ —™ÄÍßdGRFÆj”))FewóÞÚª*®B¯¯`@Ÿ[_´Â?@žŸ/œ©Œ)ª,­Üsí":p¸nÆÿç·‰ð¿6_»Ógqí¿~·“o»É&‘Â7ÿ¯Þ¶~£šk¥± §uµöÇ™¸œ-žÐšcj<°ûðHĉ…äâIX’Bš‘Yù•\v Åß|îrŸ 6†¬í‰›KÒÀGŠ4Çá ìc.w>¸Ýx ¬Ü¾m°>°%….ƒ¿y©SH¯•BH4î,)•g(¯/mbTÒ$Zb‘wZ_W]uê…{u‹”Ø“ù>Äs‘Ão< üØ18ZË ÑpÊpªfx—yïÍOЃÝw× WG óSÁ ÄC'æ±]Ê}))JÍîðäÆŠœŠÂ:ð¨Ce…‘9L¼ÙŽÔÖ¤¤ÔÔ¤¤ÖÔŽŽÖÖŽ'¸&\,¢þÁ–A,´%Λ,tkÆôg¶d×¾Û÷‡ž“¿…Qæîü½_\ìç¥Ñ‡÷oâöä÷¨,YAI B`6óÜ÷k£ä›kåVâ÷,oÝK¦]qß| ô ™³çû/|~îý\Ë$Ëú-{Ñ‚Ÿ\;ÝyîÆq]–ìÏ<žïyüèG÷ÝëæO-p},½¶àµÜÆiBðüNpê*‹&Bÿ~~èšðH.:<- –1dú—sÐþì‘þÓf.ž&yÏoÊ ÓTr5FkjCzvâέk†£o +Èù³/å.»0î%_NèlØ Ÿjz`NÂ0oéiì­?Ç +ÎÎȪ.~—ÿæ™?óÅäqÑÍq1†òÎÿÊ‘\¶ÿ%¶üÁ \©ñ/ðí,y_#/“×êsQŽÊ eÓË)#zô¡WŸè£‰yâ‰|À6gB.7yOš› ju4Èù¯¥ MÐ,'ëì…¹nòkiΓ¹½rþžt¯mζ٩£†£"~ÁÄ46»A1#ÒT µYœ²QS1™¾>¤1ÇzO ˜-9F®={_‘z¡É4ôóäÙD4ËQ‹îŸãuRÄ‚ôYF2]ã1pàò^\Ž.8½Þ–|¦ºÔP\೚ÈÖrë‰]> r¾d™zŠHFˆËÍwj©Úe¨–ÿ“uÌÌ÷£…ËZœŠ’@tYp¾˜âÒÒâ2(oÒÈ¿›ý1ñdé6áΜF\óžTzñ®ÒªÚÛ¿GÙníêP ×™'2p´GÚ’>H令{¡I­†Lá«‹tѹ?ÃCáKš ™ÍÍд—Ã.줆™nšp7‰_Ãáu‰Ÿ³p¥äJì7ß[Ô°<%Ú+~UÉx–íò9²ôÃÅŸ«mYt±eà›Î±ÊË‚à.¬ca¬Ö¾›órpb8l…µÍ=íˆ ÏgàŒÖ 7¡ã»-Уš¦Ùµ!°üçt¿ÂˆI{ªLR«Ã˜#ç`á4œMz›üUëõ†³NN–#†*}•Á`¨¬Úå4•¢þŒÿ®> stream xœ]”ÍnÛ@ƒï~ ½v–“Æ^’K-ж/ ËëÀ‡È†âúö%§‡fÚÈíúéåùe>߆õå2ýê·átžK¿|,Sýõ<¯¶»áxžnwåsz¯«õÓ·ñúûϵ| Ÿ>õ÷ñ­¯îÊÖ?m?_š.Çþ~§¾Œók_í7›¶?ÚªÏÇÿþÂýÃéþè.šg³áIùÐ<”’ÍCù(yhʃäÔ<”“ä±y(’½y(»ä©y(™l_Q³Ùð¤Ü6åVr×<”;ÉÒ<”E’y‹3e.µy(«$š‡’Ù<”)I¸bÀ"ÀB¸bÀ"À26å(ɼř‹2ó†3‡2ó†3‡2…S…R…S…R…S…R=þ!ß`‹á&CM[ 7j2Øb¸ÉP“•ÅT—SUNe1ÕåT•S¡:FUŒÊÕ1ªbTn¯zƒU¬4©6ª2ªd­æ­âá`@ô„}!_Ðö…|AOØò=a_ÈD‡ñ!|p!ðR ¥€ —-,.*\¼h)`|Bkƒ«ƒªi`"ˆ¬ ®ª„ƒ!Àä2Ó M-4 —L&áÒ€)À$\0˜„K¦“piÀ`. ˜LÂ¥S€I¸4` 0 —ä©öëëÔ÷«›àëæeéóÍ×…¯Ýç¹ÿ»Q®—«Þ8«¿%.+endstream endobj 197 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5432 >> stream xœ…XXT×¶>C9sTàx¤è;C4–D%F£± ¨((Å ‚"‘¡ mè}Ó¥Hï] *± –Ë &š˜Ä4I41јxï:ÞÍ}÷íahI¼yÀì™}ö^å_ÿú׈(-J$mrpIßœ?ÏÉË;,ÀC¦~q¦0E$LÕþG; G U/ìu‘62й8uª±ÀAöDp4¤´E"WoééÁH™¯·O¨Å‚ùóΛG~/µðŒ´°±´°÷Øç/•‡øûZxí·°·t°´p”ÊÉ‹¾³¥Až^>,¤,\¼¶[lu^çäl±ÞióÖwœ_³ü³YÃkŠ¢VZI®]'³ ³ —{DxnŠÜçµßÑ뀷“¯³Ÿ‹ÿÖ€À7,|kÑâ·—,]öêìÕ¯Yíš3wÏÒ¼ú”.JãŸUà¢2aO …­\› EóîCÿºýäŠ n¾<«jGeûx:ZFŽkD¥’Ó¸Ï}t éRrºúI‰;¬£Ù–§wŽ¿X*ÝÌcù~ñà¾&õ¾yƒû$äæ%|¦]RAƒJ[ð†Œ,Ÿ`¬c9aö§¹ Z?=cÞ¶€³t°²¶v¸ûè‡7n}rÝ~>OÀ2%¼¡„5æŸRqÀTˆQ5qÁ/¯ìr‹ ðåÙ'-¥^°| ù¿ZîIwyœLlG ˆ~þ X‰íä9ëì×­ôyp–¿-f¯\¾xíÎe›·øÁÈ ¥è¾ *‰ý‘ð>o-‚×±=‡O/“Ô(ÂFWäx0y°ˆŒÇmÁ±6?GP<¦A·›aF¢ÉH˜ÜSb¢:­ÚM¼ú—ÙÅõ‹«P­¯ —ó¶¸ÂÀD쉢;Ž¢Ú*þÑÐ{Ñž<6wší‚Œmt ;Újª‰ím)E¾üÀ8:&¨miPŽZ&HhVëHAa»d &`ž ´Uèv¾-èsÕqï-Ù¾1r“ TÌ~6x"Ö¢cdäÄzT.ù÷-]A)]¦Žk0Š‘`m0¢ÙW¼òÆóY!òÄÔV—7 ]æ§þ=SÁTâ®¶+¤pÚxd@á7&”–tY9>„¤Íü`*ýÒXL%oåŒ Äî>QB¥R[p#ý޹ÿ¼õ%¦A¹ëKÐq¦±½í§¯Jƒsø¬¨ì¨6Ĩ•¨Äå¨!0$M‘œÁ»×¸£Äàå¡K½ßxõP!éIú"mcð›¿Û¹øžŒO­L+FŒ:]’×ÅÑHÖZXžÕYÂ÷x_Ìh&øZÐþÕÙ¡2øX)R‡zñ}+s•¨ÆÇ/3<ŠÏtpJEÌ*t¡A‰°D<â1^rŸÃÒ·4õÕ@Âò§Ós>ö¾}çË“ýg]ÔÉ4†F°´UÙ‚¥ #¶q­ÁHÁ»Á}z0Ì(k_šíysYœÿ t¤‡:ñ_wÒsT!·»ºŠš;yv·V ªœr›.o@m’‘º€âá’S‚¨1x86ŠC ˜³>6¸O}RE¸ §ÕÃŽû°C[H^åÔÎóxÜ(Êši,Âw±îê6‚숊H+ bü¨Ä·Õ ³*T‡Š€~4mÜ®¾&íS8¯•îa—¶'ÌàZCP$Åtd¹¦UIzèø¼n&Ö{&®+òZz±J ˆKOÞ‡ù49“I»ÂyÝ ‡¢Éðã5ä’«¸?74'æ2;r +• ²Jsj™,:ϵËM*‰ªD%¨å”çÖ^…~ÓÖM(³wKi|NÑ„"„r’9ŠñHÈËIâ!@|kë×øÕ½3M`Mt}YsageeUg—fF…ˆùôBÀZ ^—Ž'î@s6Þöšý³Î¾‚¶nžµ ¨=›ylJs-¹ ¯ü#Í$|$ÃŽòvCIS<ïù¶fäŽ0‚qìÄ.°ó"ù³ vš°Ÿ ÉC ÞGãI°h˜­{‚.mNóP¢jQ“Äzæê_uÉejûß j 'hÐó±!^¤»fF^‡qš„†£É·0±OÔ•† %•¼§¾e¨~î(AW)"t™O0÷'úû¿x Ÿ–£pBÕ üßÐý_ÉD*HQß¡&c(RòpBÆ)‚¢W<êöâQôu(Œ®z˜cq„ҌݕÂ.¥q#ìÀîƒ-ì0aÍÿÎ×`ߨ)‘Éf™tjUbMr•%$›6¼ôm4LÃ/rP:BfÉÞŽ•1lr‹wFL&ƒò KX«†ÈJÏž<ìqt_ÏÓÓ`Zœ+7„]º£µ¡!ËÛ*é×€ˆkB)Ñ òd>%6b·5b¯¹ùÃÙfRRSjŽ£DI–O•¢1õ5-·§#7lµO]ˆ ~œÆ 9úKÅš–*¡\i|©woï½0•ü1aë„\‚¦päÏ q»ºØEj°ð΄ÚÓ‰Á°›iœwbPJ©¶„î…P’‘ŸP/C Ä8FJ¶rkçb5jØå™È¬µ$ç˜DÈo‚ ]ýô*LR³…ýC ‹LJHæÃ¶oM”"+du.ú[ÎÓ5U¨è¿àÉXÎ,:1,Ðù”Ê ãHÑZ»¡õñ拞;Â$˜ô¼ïžµ¶@‘ç¶7ÅxÔ¾‰˜utŠEIÙ1(Å•2ì´øøÒÌZdŽr³Ks‹r2Ž…ö æáíOú%ì+ÔšØÕ\SRŸ{8+ÿ`]rb*êJZ$xÖæœÜÝ]·zt_äÙy—Nºðþ{»·ñ@a̹[í5Ëêä©ÊÂööj¾¡¼ÝFL?è¢ECUññ0»Âxù Ž/¡bÅß ÿï1¬¿SÊCUMšäOBÕ#®=Åé˜É'eˆ’¢3¯¡C‰u|\Kh¢˜aŸØY¥ì2ÿvõ}¬ÇãucñM@<²ý1(¿{Dsµ¢v)Ãþ«6…y˜#{Xå_Ø}1×ê?<&Á à7n§Û–ùüðû„fûžzg×qÜyj ¾Omˆ•„÷‡Zç´a†§Až.îÃãǨݳQÄÎÇÓ„Z®9¬V* “JkÚ›kkÁ¯)/ܰWu«@¢òºa°ŒC׽ߋ;ìyâ`ÁÊÊe•¦%^¨›9ßsöè•Í ÈçsŠSª‡D.˜jTnjT`ïÙ±µÄ0Š¶ÕŠÅÎØ}"ñA]¶¬9å+ù[æ®{ßY!ݙ۴÷hJ{/³2³"³ÒHðbÓAÅ[›_Ú^ÈŸTF_'-–ùäAÿPë#ýî!LäáI«ø%Jß»uH³LîNÃI,ìÉDãscÖj¨dÖ¼Ø úê¶G8<¨¼yH%" èž±û¥|ÌQi¥òGŠ0†ý²5CŽ"§øk ­AïJpŸØ;|ˆ#h¢L‘Àz1ÛÓßÕÝUWeÏc…8b˜HîþaÓßlòu‚&ÈEJÜurw¾PA«ë%"%..•÷Z쑞¤Œ¬2µ¬ª+ÿØ)~`Ù|ñ(¥äŽqdÈøB?ÈTA¤Ò…€.®qHODHyœH³†WÎ?¾{òÃ>ºÖ{æúæ`0ó.ž€õV,]| 9¾¢¦®¢¹$õpb_v¦»íÄÜÿlÏÂu;·Ø¹Hp0vLLJIE ³€Tγyðf™aù¯„ìë°Si|ªsÿá~ÐSí#& ¡`á[»¯Øµö¾Û| ½Ïܱù‹±Áº]¶~ Šjõ…¥)Eé9|[Û-õ€ññ9o·ÀŸƒaÿ`Y†w†SZ BAŒ«üš-zr~ÃGçMó÷­*î–äå™ÃÔGTËBÃbüü¼…Ô„É7 ¥þ‡DøNo‘I°Kä•ðœ>’|È——Ò!(53VŽ#ð¿LcQ’3~…Ém<äaÊa mo- îi"ŽmÚ8,£AÏt5hSÂ"¥è 2IJÀ‰ûuÕ/XÏÇ=9Ì“'H3o×Ò~ɉþ\%ŽD¡í•¹yE‡ø¦ö®ÊË$æ§mì—¯Ýü¶t㡤ÄÅCÄÅ–Ðòð˜ÀÄýK¾^:`ôä{ÐÖ4hõNÑ¿Æo­ýÒ>w%qïüa+ôÂ~¬åêå鯗Â+?Þ€Ž¢òø¼Tò•‚"™JycCuEk÷û¯csò=»áбy³߃藯Á€ 0‹ìœÖØïïQÊù„úìzTÊô]=÷é—7X«ï/ .+E§T—ˆÃ¡ÃòE§”G¢$Äø¢°‰ÇV5óPAck¼ÉDX‹Q ¿ŽŠŠâ>:aØ(¯TWfg“†ð¤„=O*Ô©ÔŸ%ÎÕ é®ýëš/šN÷ KÌýÅ÷°>6x{Å2§3;>æÙ[Váß±2ýÑB0ã‡~æ—À ÎÉÁ݆gØ8œî½Ð{öó{—v¹JJñqÎÖÎy Ï:-±ëU)/_ûáá¥MŽC`^Ú$¤*¨¿·ö– ûœô)X[5kÏ\BBE?XZ.Ttæ°áÊÙsP"òÎ /ÏÍËËGL}du°Lè_¹–è,S‚K#ØÉ¯üŒsÙê´dÙ¶î|w«÷““Í¡rRJLûþˆµæjÌ’]v`$‚Ý`¤ ÷®3°ÑßKp 5¸ýXC[¯èüå5òäåë ¥ÑuõTµšC=Ò'xFûÅGÒÎ)Ê·'$¥Æ¡X†´·¦šú’ÎÏ\>ÁzE|ç`s@²hÞKŒµb7®FÖ($S°"€Á1b·|ÏÚ˜óù¹E‡PÓR!OôNÛ³äò*`âùêŽÜÖŠÊùcb˜Puþ[t“Á±ðçT´í]t={¢¯ˆU&Úî¶{c<AâcOº¡íê ƒ5ÁŒÝV•%çF–`ï÷€ôôHÀü‡òâ‚\2¿J­Â{±).ÄúgÞìØÁ_´¹ëLÂÆ¼êCƒ¤÷TöoÜ×ßûÅ?H,O!ë”}‡xöKüÊN;gÿú˜ ³¥æKš» Ž#æÙqÿ€à°¸ˆ ž±-@û˜ý(öDkQþQ¾BŒºË/=:ßRÞÙ‚.0xéÀæ—6xW¥ Ïá ‡@Ï÷>ç¶Ý¶ê AŒ,EžSœœ—.%XT†U7ë–à)ócHP “”/oh½…šÏÔÎ+¡•üêý¡Ö® ý‚k–¢„¨t”Àûø{ÅûÙD½Lƒ×~}ö[óéÇ:Iz¶ºƒ1Ëía]¬sÙžÇïõ Ñx-žŠ ± Qáëa6‹ï¿¾Ô"q†0n™›ÓÞÝWï}}æƒ÷NŸÚ²LmÁå‹é¤ñÊHFäÛ†Šxî‹é0wÌ€b§a¬oä'åÁn¤ï@ýMÈoj Q$>(ŽHO˜N— äCVÓñ4qù×§•H`žNÇ!ŸŽÔQÂÃt˜&.!ÿJ4èW#¦6h±_Aòñ÷bãì³£sæþ{:ž;fm7òɉÚ|ÁgÄô[ô¨©·è?™¦.ʾ¿Ö¤Z„.WŸ‚MÿöáÀ‹Y\eL…<,9&6…å¿m“£3J2‹,‹ª®-(;œÏÃW/l ʳ:d6¬ÂEçTpœä&.sà8L°Ö™EÛ;>Ã& :OÁìyÛb϶Çz+WÚƒ̆™ª'wnß| Ïâ'Ä kŠaeqn1­ÔSéóz:.RƒqÈ@ÿXy~–ú+¯:7ßÀ £&;· «*«èý#Eã)êÿ (Írendstream endobj 198 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 321 >> stream xœcd`ab`ddôñ NÌ+64Ð JM/ÍI, ªüfü!ÃôC–¹»ûÇß^¬Ý<ÌÝ<,¿¯ú$øÝŸÿ»3#cxz¾s~AeQfzF‰‚‘±®.´THªTpÒSðJLÎÎ//ÎÎTHÌKQðÒóÕSðË/ f*häç)$¥f$æ¤)ä§)„¤F(„»+¸ù‡kê¡; Æg``` b`0f`bdd ù¾†ï?SëU†eß/žø>ã0ãë‡ßoÝaþñWìwÔ÷[ŸVž»Ô}GòÝoÆG¿•å~·þõzøýâw#¶ï¿/²–ÿ˜ êâð›Kî·Ê÷ßUؾsœ p‘ç+]ø#`Î÷ð…³²àºÉ-ÇÅÏÃÙÍýyVôöÑTž#3zûú@| —‡—饮endstream endobj 199 0 obj << /Filter /FlateDecode /Length 182 >> stream xœ]±ƒ †wž‚7@Ô4†Å.mš¶/€p }û©:ü—|ÜýÇl¯£³‰²Gôê‰ët„ÕoQ`¶Žðšj«ÒAXÕ"aÃM†÷'Í`v¾Ëسæ|â»Iy k ¢t3¾ªDoŒ àô_«Ý “9&›N Lg¸È(*cSP Tƺ TÆ—ŸkÊ?%ñª-Fp ÏÂØ%­uð»<øP\4‹|¿å_6endstream endobj 200 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1182 >> stream xœuPmLw¿ë!w@q¾¬Ólg{1â4S†8ßð-ˆ EQèpÙHh¡”Ö–RZ+ ¶Kï¹¶@Û)2”Á/[t°èÝ2&›c 1Û0›fËLœÙ–-[Ï5˜;Ð_²ûpy^~Ïÿ÷BSI*Цéwœ5;:M֋ͺ&kõ~“¹±Îà˜Þ.—_¢e^%/a€¯O‡ç€šuÒ~Žaœ2ÇŸÃûó¨tš.³{ƒ'ÏöÕ×?ü:‘g³{sSÈÎÊZ»zµòß$=Bn¦Ph¨¬µ¹j-‚ÁZ%fe {lnehVج‚ÑTc¨«lÕB©é€ /Ù±¿Dع¯¾¸deæÿ*}fa78LÖ:SµÓh1ÏÔ3b”ÆešU5X¬æ:Ó,*÷q”Ò†JÓ£ÅÃÆtpvftΖïZªfk§¢¨TŠVÏ›¿b[Ζ-Ò@KtÑaºƒî¤»è•¦dN%QïP7©}„þ[uVõ #0s?˜û€¾¡§xrñIçÜ4®eä5`Ï Üj|!…0kÿaýÞÃÍÚ ’^H €4Yz†”ã"²5Ö2²½¸pbº§YŽŽ2x}òšp©ËÉ"Üê=^8æîX[ Õl·ë.•ä|LÖögE—A&,÷eÔ¯4¡xóŸü ykW ãäÕÏ»kÿÄô,làž"=…,ž¼­‘GØès5‚ûvr„mW_N¿¯û@¥ßHñ‰õ.že9cŒ|O¼òÈ´ùœþjª…¥•€m ãìÆ<Ü AÇ´ó6hi@«O»j“@tùÄ\A;É: 9@¼H®!‡«Îb-ÝM‘¶!óâ ó*§ñäPDŠêžÖp_ÑðÚÔJ$Ãx¼‰Gzª‡úÚ:Ð œ×^Ø è>¬¹RúQ!EJ‡ iƒÉ|¢&½¤€ì íÐÎy£;„HTûË Ô¢ù".‰ãzÀuJDLF˜âǹø´‹ ïÄoLb%?Þ®^Qò+É¢ïì˜ë€ œàPµ·’Ü»H]G ¦ǽRçâÄë,ÜÞÈG½ß_ú~é$èåâ¢Ôè @“]Kœda3Ù5ÜÔ[,äANÙ«å›ôÆ ëŸ(Â!ðHbäØ%÷²ãdC¨ÐÂMEYÈù„lA}Fsz”¬$)®$żKÉÏ£š‘%rNƒ§ØQ²kw%ÛE±^GN±õ’8¨ý2yP’¡ÿQ¹è™‹„qêÁCk¡ºþ¼Oßþ¹jÌ} ~âäÜ'™Ìe¬¸Eöa-a¹žä3’Ôÿ$1ŸHÑÈ9Jé°‚8‘G.¹ŒFÀTN™?ñØf6xHÙM„£Ón=Ónßó ¸G߸´|hóélÈæг²E÷ªš~Qrh›’I-á¶‘}@^摟(àNK0œˆÍÄ?ד—uȺXHJNMÓ¦&•ÚÔ) N‹÷»¤N)êê>¯V‡Â‘.åëîŽâ„:¢þèˆÄendstream endobj 201 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1140 >> stream xœm‘kL[uÆÏ¡]=ÛêæÔÎÕm県Ì0²¡&·ÁÝÇu\¶qJ¹t-”Ba\ºR -oOiK -k ­Å(ÛØÆ.€2D¢ ›º©ÑD3—¨Q£ÑÉ™Ñþ™,oò~xŸÏï}ãGa8Žo>–œ,Q—VKäåÅ ±RY­\¢ZU^ŠlÅ#Û¢"Ûy5löÊÞ•·×€Bþì6~ã³Hµ I7¢üg0ŽçÈ’”U ªrY™šŽß½ûµØXn¿I5ЉqôIq¥RSSYNK%ô‘¸ä8:E©áŽåtŒRAIË$òRZYJgJOÐYÇ÷g§f¤f¥ß÷D¶ÿ1 TIêK1,KÄNb±Ø»Øì)î9Œ-àQ1Qã¼­<@á ÿFm¾‡±ÙaôJ(B…ðHÊ}^ă†D¿]z+5·èŒ‚¬[>:JÝ(Wœ;F¢Õnèv™»í¤kÚ{û ‚vuÎPcÒS,ÿQº¾Ò¤/q³ê[Vg—>§îÀ€ÑDWøÜÍ Í›Ãî]Bk)—zXö!h#zí@;©}ã"(­¥Ï¤UgåžÎâ`ã};0.³…ºÒ­`ú¼â±kK@Üò* ¸^ÏÃtù'8ü!-²ìZ­©]ÕN6gÖ甡nõ…<ŽQ[ þá¼l¶9Âbë{=ã`%õÝ-M*¼ƒlõ(&R€`׳/°ýiê½O>šî÷RÞŸ™za cÝžþKî¡‹`¥e¢“rê*ÈWÏ\ÿoÿ$uaáæøK¾D­Aµ«½šjÉ“®à³·p„}Pòƒ¾>ò3úú'^ÄÏ:õ–6­©Mg$5‡2²Ò¨¨ñ÷Ûî9jmwÏ\œ¸b+ Â@óés¦0µž&¿Ô3qûØùÒ{ó~NÐÊìÐÍt36´-2¶Å1Êô<"ä˜ÜMugLuT’ j,m@¡¾ÙçàÑÐÙil¡Ø¶JMúw@\¯},z¨ˆF³¹Ûç ÝEiàä¢Ä—öpQ¢àÃá>ù :Ë)ùSäÐÙÛÛÆöroˇ ² Ã_Nöÿu}‘šœ»å½\ƒŠ¢Ž9hÅ ÞeîZX8Lew°$7ô«KûÅû»‹ä\~ùaÕ¥4„ö„ð›_=Éã,‰µ‹sCŽk]j^à‡/̳¾ï‡,óÐGÌea×°oijûw.& (´û»ßÜd*bD/³ !ó#hç¸:¦)¦6Ô D’œ==¨j@Zwg=¹ŽŸ©®áúA†13½æ~«ÍÅ…ÃVgÀ̘­·Ù*|Ãþˆç'4endstream endobj 202 0 obj << /Filter /FlateDecode /Length 227 >> stream xœ]1rà E{NÁ ´ ˆ¤Ðlã4.’É$¹‚ÅCaÄ`¹ðí½¬å)ÞŸy»8ß%ozøjkø¡M§\b£ËzmôB§\”±:æ°í&ξªáðáëï­’æ”þéÏ4|Ûq’Oæ1ÖH—ê5_N¤fœSBE%þûeö‰%íGí‚§šGžìp²XMW‹«í:¢À:vP`º:XëKD€SÍŽ·:Ùìúæ×78Y °1È3ž÷í/êÝ<«ÐáÚ•M ”‚z/¹Ð_Çu­}J3êšjsÉendstream endobj 203 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1709 >> stream xœ]”{TS÷ÀoɽÃè$wá!ÝM¦«ÓhÀÓUÔù\±*…(¯!Ð@„iÂ7ÄòÊ#‘$‚Á‚‚Sä¡uó±éNñ€:[ÚÚRzÔNeý]zÙq—uþ³ß÷œß9ßïùþ¾çó}ý8˜·Æáp|߉ڧÌMÉ[²/#³P‘rpÁø:Ä¡_ó¢Î…?¼9ÁÞ#¯ñÇ…¨À%üE-ŸÎþLåe¾æ`vf–J.•® aïu’Tds¨dWJZŽR}('[’’—.Ù*Ù­T³ÆlÉ*ež$5#+E!“(e’˜Œ’Øè­û¢%Û÷½»'zuèÿS½Ò1 [”R¾æ­ß”ÿZŠa›±x,b$ö3ÌóÇt˜óÅln˜7VÇy—ó•W¸×En¼·Èû"o1/‰÷¹—¼ô"#± —ª¥9ÝÓ—°û!Ê›ïò'“醯DcŠ<µ¬´Hƒ JÇŸI×nÊÙ™Û®q¸ZÛœ§ËNZ¨žŽQ¨âÊ•ôub¾×°Ã°5oMFÉ^¤þ­Üè»`£ÈMGƇAõSǾ3;.‹Hçë Òö'Ÿóüõúm$µP,Žôc Ü4ÇÍ¡ûüÜxTX º ­ p;ÓÝévŸ;ç¸a"ÜxºÁIpö€ÂLÈñVã1”CùNûΦ€ 3:+œ„ÚãÍ þi†hЃ@î‚ÿm0Uï~ÎøH%•²Ôc ï1×B?Ü€³öIy¾Z ¥Ñj¶Ü{ðpu› ŒP•UÚCÕl‹æhe=.C§Xò’{ëÉû¿ÝôF7=òûÛ~îB|£±¡GL·à=5 “”ÍÍüŽŸFC•†)›¿À”Ñ×+ÛªÍJd6ÈmüɽL<_‰ÀWRr|À| ¬\‚¢•àqˆin2!Ë1?‚[Dx£ˆm˜.ºhù6­²aÛÉ¢YýU˜a¸okv¯¾ºáNI›´1"a;±¤¨ÞÒŒ”õuí|·ÏÄ"ÊÇ;F)ø ¹L Çb1ÕÔ]\æf§ùx­¹Æb9.XŒaÿØÿ@Mendstream endobj 204 0 obj << /Filter /FlateDecode /Length 186 >> stream xœ]1ƒ E{NÁ @ÔΡ1MŠd2I.€°8ƒXäöUS¤ø;ó`?»6^/Wï2eô 2µÎ›kØ’:Áì> stream xœ]‘oL[eÆßRÚ^¡CÚk!ÛôÞ«Ãè’B€i@³Ùœ‹8&PZ… g)”Ò–^dm‡Ð"s”žR»v£l ´nÍœtˆKŒÿ>l“ÉₚȲ¨ }ïr—hå‹ç$'9χ“çùJNB"‘H±¯¬’mÖÛ ³+[õ­Ä,~«ˆ4‰L m¼÷^äb'Çïa%~]5ã}éH,½ÚÈîf[\­M&;“Ÿ›»#;;1Ÿcê\Ì®¦To°°ŽC–&Fo«gJsÊr˜ý¬#!61O³6¦®Á¤·ÖÈT5¼Æh5{*5ÌÞÊW´åší9ÿ7µ±#„$yù;žy!%"Ñ#H…24%£ tMä}“Ô‹¹´¿“È?É}åa÷’˜×dp&™ÚÛ?Eós²h¯¿…ª3è©0Ë¢p ¾ˆ÷OÊŒ^·š2™¥3ŸàãDÿ 3^â¿c?â;ë¿sÊøzÙíƒë8ãv&åßÄ{UV©×Ñ]ív¾Ó] í@/JñVœ6™å6¹py~%pêS×E– ò¹ù5žˆLÓ¤y®ÜÔù«ßŽ~ Ä­ ; ¶í*R„M´ 2$dÈíÞÖ-<-ý×CÛøU,ÆÓwuX cÊk«Ek5kþÕáµL2ñGp± n¾´øäÈRìòwpƒ Õžy Û˜ç+Š£ícC#ç§,‡ýÔìüõÀY He|l±;kMßÑN7[í½û{œ¾nt'à uQºt±â š¼„Å F]UÉPÜD}0zŽ£Éù’Iû9K {Ä ^-ÃR¼ùÖÊjƒ9ÎäøÖô+ß‹y/.Tqó:Ù„Û:}¾Ž.J¸rß 1ã÷ °=E”Ý,ÅYœå•pvY‘÷Ô}SV©„‡x‰d#÷úÛ—±düB «–'Ê¿¸þ•ñ•÷V2ɹåĨ0QpWH©>ÐÞÔ@a­ìtÏG]³@`Åâ/‘SGÇ ޽M׿UëÖB9ÔD¬ý]A/àqÑÂ'2¸ÃwÃAª?2ýÙ2|ÑÚÎ3}µPFŸ–=èl6XuP /ÏØ¿&ȸ'à l‰œ˜²v¸,]oäý‹e4É0Xñço8NkæwG0{2<,åRS©”ä*VþÈScþ úû ry,‰އ}Áàqù&„þ»«Žpendstream endobj 206 0 obj << /Filter /FlateDecode /Length 471 >> stream xœ]“;nä0DsB7}šÝk`ÀÄ›8XcaûúP†kyøö[Uc;Ø ¼™&»Ÿ(žî~?lëµ>ý=.Ós¹Ö˺ÍGy¿|S©ÇòºnUÛÕó:]¿HÏémØ«ÓýŸaùÜK‚²Üøqx+§§®5ýÔÞM—¹¼ïÃTŽa{-Õ¹iòyYrU¶ù¿¿Rs[1._¥-J™®i§ l³œ‰cV–[§¬[âœ`ì~e¥iðÞexGÄ:ÈFÖ1@6êJV€Øc"¦izöí1dß¾Ë }{Ë Ðˆ)+ÀDŒ¬hØÆ´•q+C¡©ØXlž 1¾IÁ¨`CV€6&#£‘a|“‚Q!aü$…D…„y“fNœ9á=%½«Äwå˜È5•s*G¡«ØYì}V€=®._§¯c|—‚SÁ1¾KÁ©àPwé;õ=]}]}!çt :ŽšŽDȹ‚Žãr™óÈ®._§¯/YâË;ÔCúAý€MÈ(h° 6!£ QÀ&d4 Ø„Œ‚F›QÐ(`2 lBFA£Àq…Ž OÞ‡ïŸWƒ—ìûNÕÓÇq”íª›¨›Æ ¶nåç²î—«j¤ú×áó\endstream endobj 207 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5353 >> stream xœX XW¶®¦¥«T"JÙÒ¨SÍ$îûcÌbŒD¸7dQš}„nš­ºOw³ï²74QÁ°÷¨Ñ$&2&f2êˆI4fbÌx‹w™w 4ËL23ïÙ~|Í­{ï9ç?ÿÿŸ’QCì(™L6jõšõ᡾a‹f®ŠÕøFI_NÇÉÄñvâïä€Íý½ýz{pƒÃ“ãÇ9¡/G!½#Z;’’Ëd›‚ÂÝÂ#öFí Žq7gÎü™3ÉÏE®~{]—Îru÷õ Ùíê¶ËÕ}ÖšY®kÃãÉ—»]§„‡¹úûj]Ã]7lvõò\¶ÞÓuÅúu^žSgýóµžüNQÔ¼WÃ6‡G,‹Z»2Î=Þ7Áoõ^ÿÄ]k=‚‚×ïÑ„Î÷ì‚Q GN™:~ÆïfΚ3Ž¢ž¦ÖQ‹(ê jåIM¦6P^ÔFjµ‰šNm¦–R[(7j&µ•zò¦–Q³©åÔ j.õ:µ’šO¹S«©5ÔZʉb)%5†Š§TÔnj(5Œ ¥ž¢Â¨”#5J6ŒšO2J ¡ô2GÙE»ÙvoËË›†LÒk?Å>ÍþŠb¥¢¦ÿΜº|hÙ°g‡ »3<Õrq¸ñ”ψe#>vÌq¼?F~8ªzÔ=§NÝl Û?zÇèûÊµÊæ1îc²œÇ;?ë¼É¹W% 7GüCn'P oAôŽ—õÇŒé5 +Hµáø~Z•YÂç'A22’pÈ£Û*힘àÅFFC´4@ {^%ÐëM‰TB9ǜӔ*T¬8‰§g§šxÈt õ„HNCwZŽC0X…Š”X§@ÃÐ5ûâ%Èá·…d«Ò‹{YøÖf7l†(0 Ú@ÃÐÞc (Ù³`çòäpÆø‚mÄuöúRAúV5®¢·ë`%9§Û\iê(1ž00½R]jäN³ýäø…³%[×q8éW×>IE« Æ í‚¬Ÿ” oˆÊŽpº¢BO#ŸÎ‹×LÕà"Лù@ˆìdQiècE$€žOOÓááø%‹¼øìÌ<ÈuŠÊN¹ˆ¿vCØOùÚª0ô¶ªðbœ¹Ýýec ¸hèc–CPh””Ôíæd”AQN^NšŠ‚Tè9¬ËOð. Mô—ªÐi9!euÄ?ìd7)Mœf•5Þ@nÈÅ´[‰œŸy€1;ÉÆ£LAŽˆýî;äÈ-(PB ¼µ#|ûöx_ؾ֘C‘Fi³68cmo:övÙ8í!U»k}M›Á—!ÅÂ4ÊúlÕB¢Íéa/ª¹áÌNßD%ršú<ÌkK¬_wfâ)Rm.çfìT? þ·µYD×G¶ìy4ÙÝEÎêc°bÅü|ê[£¹”*0C%ƒ"hvØ;-§ª:Æ}zn.¦Ô$âžpÏ 7´PpB®}_õUÙÐ ؜ٿëúç …+¢ðìH7ü ž«b›!¯E*¿¢ïk¨m¨"\±@«™ÊÍBiŠs^7‡Æ*Ø. Í›W9velŠpkÿ芦VqÕ¬ T?ª¤ ºÅ\ŒF¼®!N’Nï¨4N/?ü³3ë!G*›C›|Öùú®‰áŒì7øé_é s‰é –Ô9ž^ʵ©Ñ4º½MF ÎHŒIZˆf"ªk«kËš8ke¯k·€º"…>DÙÐ3$ÐïûiÑ[9pÏwþõžŠNË»¤¤‡á6´òŒBÏÉ*&gh6¬OñMQÈsƒYxN2›‹rgÁIf‚Õ³sX²Â@JgE +ª¯‘µC)Çä¢VBg|Clíî7ƒò^-ÌYZg˜æÚŽÛˆÊ{>ÊÌ™´QL)äUªïÒû¡@›im g0èõ™šMîn‰ ö,ÝRY«nÑL?¦?–ºŸ¯I,L³&@3$OŒ¼~RËñ…Æ\-0ɶWGÓ‰ /Î5™*+¸ìÜ¢’œœ¿.ÞJàãxäʲì6©X­Žwúko¸í\¯„ˆ;è©<îE¿ª zþ\Á¡&4QÀÑêpÚ¸0xÂ4ž‰¢ÙoâFòyÌ Žµû õâe5¾®C´ï 2”|€ŸVè󎪢ñôŸÊ»Œž·e•Ûó™GNrèOÿrøyj<wðí nŒoO? Çáhmã9Æô< B¿L‘šÊQß!Š~ÑP|@-ÖÐÌÅ×8« ðãWÞØ +ÀÏÂh¬ô5³6Hý¨†2h_ä¢4ŠvË%8B>— —x€ § ãÄÙ‚L¬'(:”ßá 1…› a4öïƒHH5²tÏàV z>× y.õ ’è†ã†0"ÒÝ„ØËÑ$ŒT¹Iù|@¾9o?>WUk-n5I§ŽTR±Ö3ˆY’¡Ù7åbx¿+9%¯/ð‡ùL¶k¡ïX´¡ÞôìM7ù{WŒâeÕ6€À4ÅÖ…h¢ã‚—~´öËë·Žß-åLùðÔ3âtº½ ÎKmp{Åãàú‚óç ° ü¥»1–F@<¤2øôÙØ¢š„2KÀ—zÁ\ObÛÎû1ÓØB¤õÍPe,J.ЕøŸ™¬Z„cg ’Œ2Â8Ù. ‡²eü²|·…°3!.Cñn¤ÄUåh-©e„³‹² ï£7Ußã7³S³ueàR–ÂìBÂeŸªjηgW›ž³5¾YÑ<«Ó…¯Ð‹½W&}ÄŒ[ÊÓáhl ‚žr¹Ñ„u[|Úßô.ÛÌÂe¾«4Õ‰õ •UõG|r@ÝPßSÐ̱3óÕ{h/Ã’Ì×CÜ‚c7?Ãê}ñÁOÙJ9v©oNcБqÖ e×Ôxéq%k¶$tǶ-o¿æ#43—„ !•óB‹•`ÚB!Ö†Ñ ªô’òïÓoòó…––ºó’„…ñ$°w0Ûe†’4’í$½.3cÕKª—¿M/0˜ Ž ¸¨¸VZ`ˆ4úM<`—´þC0º<¾ÇJÕ4$-µô g×ü¨-ŠÁÚ`_ëAÔ NU×Ó®;³âþ̇ðHù©¡» Y ËJÍJ›„õ*<•eÞp©oj Ârž‡õ¤$ÛPi(Ž@óѪ(Øa+ÜÁ% Kx3Ã~—o²å·Œ­O(‰Ú›áÓxü½#ãÐJñÅ¢úŠö‹fB¯çß%ôŠÜn´ÉZn _ÉÅWÐpe±x3¸˜åž‘›Yµè8š‚æ\ë>WrÒÕ¦ŽËŠO†0&²*¾¾¾z¿ðóñèé®xV>˜JÜ º=UÀ î6q„U&ÎEëI&S±=ËÈíž8ϰ¼Á¯!¦eÏQã9è`ÐAEMTïy‡˜J‡™Ïà‘Øù‡Éhqôa­z«ÄYŠ4«¯Ü§àœ¯ –lÄ ÃH¤¢½€²„(böí/íì[ÎìÑ®„ò`À›8öüË‹<&«1ý’æ3ü‡c•z#àáÈžfGß>Úy„cŸ.„BC!é⛢˜ÈʽֆŠÊzî‰G 'pµ¡ ‚ÓáûÐ÷ ïö+Å å·nb5‡ñ¶éI *X‹†f×Z:OC×8öXœ†NâžbèÅéx-z‘F®÷oÞUOãØ¿Àá ¨fÐ<ÝU Eä;õ ëc¿´úµ”ÞàÔx:újÊi4þjËigv4%f‰“••É‚˜.(˜‹¨ÙUê Ì ·/mn *ß§6ƒ Kì.jØË°wu›“ü·}íÛõh4rüáÄÕö„·ë8ÏÖ7`aáH3‡å&4¸•ç””X“„}d0¸såÒgGÃ[RJÕ‡tC1dòi™°—Ñå%Ô––VsØSʘ6—c ©yp¯¦Áܲ¿N]VÕPf¦¦Å¨‘ü£\¿Øg&Ǻ릾Ú}ª¼ðýê/ÍÈÑø‚úɇ·Ô?Mq{~}Š{¶k<#º«`üœ™ËÿÃ÷Ÿ‡8»öJªvÌŠŽ 2Rð›p_ÞŸ~K™ ÅÉ) O3r™«5Ñ’0]UÚ~}þRFgÚ»ú°¼õNçgáSæ[üÔçx2‡¯ü 04ŠnËÛ F~þ ä@_æ€ì¬¦@د‘øvôtžƒ"`þTv³NãÅyÊ;VãñfP¡êÍ•Ùæf¨æbO•¬ëïtƒM¢éxˆ(§[ˆZHÈÉŠrI*ݳr©E9ÍžÁ¤|],È ÔTý$ æjÓ[PNæ(ϰ*Oñ/ʦèºÐÐèèÐк覦ºº¦%_êÂÈÁ±É/9B/V“#ö@´)¨‡a·á§‘×½ë]‡.YȤLùÛ+Ssxb+-¤&ªq7Íʨ½ #fúЉ|°dç4uôÔæ!àYAXðõMØE îëmѽ {’‚`Y ÒŽÆcôIF).£Ìà ì¾n=S{0#ÚÊíÊÊЀ– ­K¬m¨®´ÙÐùâdìàåÊaû_Ø­_0ê²úZ@wç¦ø©qÍo0¯DßxÉcT»Hû›•F¶ízMkY9Ô½âÆeeB&©™„Ƣϯ¢aܱ™¥ÈО_ö7:0ƒ) /Ŧ$—Së&©ÿ»kïùxŠè¦Ä¡$C÷¾hÿ¨ºÚQÃ%§ë¥7ÝÉyIåz)¢ÅZó®¬5ÈÑA´Fù.nXC?*åŸ%G›O*£­De£Â~®²9Yû¬²Ã7P)GCÑÇJø€¿üÉŽ¯_©{ÖÁ+Ñ;¦‡,Ï|^wó´#/u?÷iR¼½¶Ž/›>Èý®1 Š•dD\˜ê‡¯¦F‘ÙÜ­4Ù§ž…p.Ágŧªn]¬hƒp!¾rVÑxVK<¿‰ÿ¹Ó ÜÊ!fûÕ?–¸í¶ –7b¶gùsqVÿýžÀ<ƒiϧÿ»”ÒìeJJ«âßÙó¡v ö¼¯§«“cýtb<Ë2þÙc¾Q©ç£S‰|¥Zâk‰'=A(¦¥ºkO}wãà{Å-Æ$’ÒØÑm? +Ê­QÃú†sÆlذÃa(8 ¯3™É';×dÊ{ÇÁÁf±æçYг-Ù9¹OQÔÿSI®6endstream endobj 208 0 obj << /Filter /FlateDecode /Length 472 >> stream xœ]“1nÛ@D{ž‚7EîÎa§q‘ Hrš\*L´\äö™Y)R ‘Ä¿óækOÏ_Ÿ×Ë­=üدӯzk—Ë:ïõýú±Oµ}©¯—µ9öí|™nŸÎÏémÜšÃÓ·qûýg«-P—»ÿ>¾ÕÃϾOþèxiºÎõ}§ºëkmÎ]WÎËRšºÎÿ}•N÷7^–ÇOûò© ¥9÷_ŠÕu|ÒžŠE{’ŠE;ÉÎÅ¢ek±h«ìR,ZF9Ì$uŸ´ÇbÑeA¢íe‡bѲ¹X´Y6ŠE²Ì;8ó ÌóÎ<(ó0‹v”eÞÁ™eNŒ#)Fâ!É%”P,Z•“85yrÒäÄ&’ÛHj#3~6BBfül„,„œŠE›dyHöAYàP p < ŽGA£À1ð(h8b^83”ì î ê ì î ê ¤‰ "°'¸+¨+„ÁÚàê êÀUÃë†Ö ®^7´îàªÃë­; á€!À \0„ †ƒpaÀ`.  Â…C€A¸0 Ÿººî‚nÕãµÓǾ×õæ«ç«¥uYë¿Û¹]7½ÕRÍ_åíÿendstream endobj 209 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4319 >> stream xœ…X T×¶­¶¡º@Tè²pz¿Š$à7NqˆsEш"ˆàÀÐŒÒLM3´ ‚r›Q@™'TETШI(qÀvz1>§8<_4æ%·ò/­›i“¼üµzõZ·êö9çîsö9û¶ˆ0BˆD"óÕŽŽòù¼).¾~Šàíáºgã…q"áoC„ÿïFÑBËoÆÀL ÌŒ:ÿfù‘>²€ñ#à*sB,¹Ëv,•‡Æ„øùGZ͘6mæ”)ø{ž•WŒ•ÝT+‡íÞAreDP€Õö+‡©ŽS­ÖÈ•øa€Õyˆ•—¯ÿö`™•\fµÞwƒ•ë:{—uV+\œ\×}:õwQõ/ ‚˜¾$Df¾<"R±2J¹=Úkµ·¯ÌÏß%`]àz×àÓgÌœ5gî¼ùCNøtò”©ŸM#ˆ '™XK¸ã‰uÄë W˜H¸;b#±”˜B,#ì‰åÄ âKb%1“p >'V³ˆÙ„#±†41’°$Fcˆ±Ä8"ž` ”F 'Fæ„1cI‰}!:5dÂz±Tœddm¤1ê5^n\G.$/H$Í”ˆò ´&³MJMƒLŸ ÍúƬbØGÃâ‡=n3üê«¥æsÌÛ-‹é0é iˆô8mBo¡‹è¯èg#? ‡ €É 6JQ­à/’˜Æ0ÇÆÈT(I>”˜Æ$’ 1)9™ö–ŒŽ!U¡ (°qPDÖ€†FðçÊ_édùc ª…o9´®gY %pjf ¥!Ó#ó6k’©>ç°“wâ¥/µÐY;ŠnàBŠÝ •ä›ÚçyxÆú²ôõÚ´b/Ö–Ü)ǾuÖO Î­ƒ+8›,¨Å‘à_r[á’®û×#Î,Š’ì Áûjuû&öíã°çvó¢ ZXª 0˜æS~DÆÈxÊdŽÌ_M„FÐèÕkhÎ.Éa¦;ÙÙÙ9Ýzö´ë›ë7¾uœÁb(œ‡“yx¹?| ´¯34tÖ[dä±=6ÄŸ¥_Ï ù ðÞ²ÿ¸Y¿£%æ  øõ+(å–XÎpøÒn™ÏwçØzäåË__¿¼âsï]¼¨Y KðZ Ó(ÇÈmN“¥ R&Ê`6èO¹; i3IѰç ÙsêxA‡|6À²ˆ,¨Ó¥jž@3ë7-\°tÕµÇ?Üäoßi[äÄêÓ$çáÆ¾ƒJµÍZw|ØÿÒŽ3/$zW‘Ѭ=:åP*ñÑMM ²”}Õÿ.Ú—ER¸‘¤Aµ+ "õ¯ïJ“rØ^R¥G£ˆ«ëU„ ®ޤ‡4æî;Ì œˆ]OâŠ)ÝÕ>×eu„ëf¶^B_ï3†ŒþwÔ¹`pKúލCˆCb8”¤­Þv?‚›!«M>¨ÊòâÚ~?>ºèZⓊ…x!ˆÕœŒ Åå­Ã¬¡W4¸‚ÓÍo€>Ð’üS,ñ« úêð9>’—öð0×ÑV(e@Gp}D¡÷Áð¬)…Û³Wæƒ&ªº¡ö‡26]^öжÒáx ý]!¨ ŠLÙ•¼‡õ-ÝbqÆ—ª¦ÉÝZ#ö'q‡£jSÞÅU§Þ©àÿIk¼Ë/+Ùä²Ô|9 pî”Ü4‰ „6äÔîcÏø_e¸çW=oé'ÊeŽPJá$-ÐÞÁð¿\!à  qʽAiìÞÍÞŠ@-UŒ†3%ïKÍü®¯YúVŸŸs%}éJÿ!R‘Ÿôøß|týŠV„“.ǸÄnhO`/Á½à.Ù‡ÿü—‘tÇœE»ºzVHþ¸#“œÒv÷HkÖ¡6–^¼#³ ”Œ»ó¾^Pð"¨À)vkÐS‚…ÒFr„èU Â`Ý¦ç ¶T%HxQ•*öëbŽc‘éàÖjÒñÖ7®60mjPö$‚ï—U‚r0¦ûÂ!ðÉè:²°ÖÐC‘ ²„O˜*hØ ‡3¤':nœF¦ÖÄ]L:¤:ŸZ$~ U·6Aï‘N¥‘áqã3þ‡éûx¨å.¡G9¾8écÚ@F^ñ•Êï4ešܧ3äÅŽÙŠb§Œøc T€œæKðÑèÚ*ÐÈ $l2ÿœ—žÖbGÑBQ£.¶8Uȉf¡ŸäžÓ=då9,©ˆ©*ªÏ>ÍÖf”€\@Ý?¸†C ö¢ÑàSŠN°½îøzÿÐÒ‰PÕ ÇõyÁ³ƒ`@$ˆòVRtc¬ß:ÎÙ«±µãíah®yßD‚ºny“hœEÐÚ¸U?œðS 8ìAîË©Ë_Waã }:tpœµ’ÐY£¡hº±760ƆêíD‚î>¤ Ê8,âÃwý,éâá^Ô7 ÄpÅ ´J}'(cÿ¢ñ¶}}Ñþ¢…ñ؇ê8ó7—*Ü\"¢Ùå(^P\깇=oðhG{~ƒ+ÁŒh«ú)xS ƒ_ˆ1åª\EüN P³ÉªØíö€š½üúã³õ¿Â‘Åi “+Û«IÓ¨3j‹USVVsÛx %kи™hø¿&Àð“ú ß—Çe&ÒÃúñ¨d´ ùFO&¥Þ•n¸y‰'MBŒF<›‰ö¶â£GqaƒØãl?ÑçpC7ºn™¿x¹óµÇOùî[Wθ»ê dºà0^tþÌ»#|úµ3^w¬—U ¬s+_Q°,«Írø'bÐðÉ68ûæ?O€#áØögUœ-´fPYúàÛ–¯À pÌ3gñ{ÑÍpópÀYX)œe¾™T‹æoûŒÝ8i°Á½Fã úEÝ ùÆÃNh28ø‘ÉIòÖךClFhy\9 J« új EwÁù_¯é:Ýݺ¤¼ÖñGŒâC![ÉÔ(êÝ"·î‘±ò’€|@MYb7Sv ¨$‚SÇ%†0°½\ž¾wÅö=@EÍüÅ ÒPúë•'ð´„°ËHú\ˆIq $ìWçî9€L°?+·FU¯®ÔKí­' êÚØj®baz&;¬<©ÊÒ’*9 ãºmÛ† ÛÚ:;ÛÚΞmÛæÊþ‚ÆÛ~ÛøO펵55;›É^!ŸA˜ÛOÔËqưý¹Ðƒ«þ„&Š¿Pzÿ¯ÎèÒ‡Zh§õÐb_ ¥¯˜Ãr Æ@¦±»÷ú©ÂÁ©Ž.­®bãC*S3(úßç½0öÑ¢ï‘ ‹V Ò§ªWa ‚‡ö™ès›¬Uiuaý¢y¯±` , ¢è_ƒJë⎌û¦æÛ6Ío˜­>NSÙåÐç:ù¼ÕyËû^¦ýI ý²ÅQ~-lëŸK @dc hŒQ'n€L§~ ÑÓÐx¡œ©¬”Ë##åòÊÈÚÚÊÊZ3xðÒs7`öm7FÑ¡B0\À€ukp‹Ï)|¿}QYvÅñ™[òýŽ‚TÇ©S× ¤pjx&›¹£8 ó½On@K‰Nm(Ôñ;’Y×VçŒpLX‘í³\ëdy»¸c[%ߎÍÛs=.+”º.e醀±îÛÖ-ñòÎ- e=kS¥•¦¥•ù÷kÄô‰ŠÜ‡rØ“A|ÂYÜ©ž'Ïú( ä…ƒ:LN¿ð|ñà§Å–›‚Ä‹ìôu‚fd²w â€o˜_X@ž;Án ÒÄ¥§iÀ>ЦZÒsw£ÍáqA¶è h…6ÍÐôK[k„—Š˜¾ßVk¡…î#R Äà(2@äÏÙJÞ˹NhÑ«Ø`P†Ë T!–J?œŽ^Ô£…*l¹\¸Ý¯FÊÊ:ôŒ´^íîæ¶úÜ;>«3èîìzI"‹§ÓÞ¾}ú´`áKý¾ß‰œ þ‰,šïïÀS Kƒõã÷£m@zŸ½IÝgÝÑÇ^|íca¢¤@£‰›ÁF/vofôIW |`R&Àwu©J3.Po´áP§äýõðÙàÝ.“Ðl-;°Ó‘E±uHMßü`Ó_lé?+ÉÃáJLÆÇ]ÛÜÂ~RW¯±IêøÝl°½w¨÷Ušb/ØA)ówUµ¶”—U²½ŸÍ Nü,C“ ˜0/<õç®|œ©ë×óQ¡,RçOB£§+›Žötƒ)8tÂ=dÎÒVÈdÁ‚ÙmîÝXÈÒ/ʪ‹•'å¤dqÅ'NTãÿ»Ös–½«“w ‡‘GRrr2PÑÑš…OÞç¦òЗžx±êxMµ[pB$\Ê€Ž=Êo˹ j¨»¶WñÍuÄÊM+vTÄá\XlLšÇŸ½JÝñuð±´ö8ùî„ý†Õ.γÂl3OûséÙ¹ ==o ÐddT–‡EDªf¾tÐòñ¯úÛÎ㲘ÎKÿ¡…I8¨¹¸•¸0?}ñ™z¥(¶±p5L0¸”é¸âË¡ú+%;R’••·=t´½ ‹Áö«-wžçí^Ô¦à4šœÿÕʲ°hù.ßù–AchñæëÈ‹°ê;¡íÀ‰ŽÔ â»drQ,P÷õ•hnK?/ËkX˜I:¯Ü¼Ø¾;ž„L'üšŽj±™PÕâòŸß––d¤ƒBêصNZx¢'ëAÿÞ¶suÉ¥âîvpz0ç>2Cfs¾˜·¼ÛóRKßtˆ^²~þØOŸÏ„R(}þô5;63ë¶Ù³t£½SÛ…3§îÜéôØÈ &fåêuóYÚeþê‹W¿þêÊã'Öè¡u€S{®Â:^zF Kêþ ] L@ÄíñÈØfvjüt:4j?àxè/fÌÀ“ZdvG½ ¨wA¦‹£ê75–y÷Í;ÇFeýéÀò1x\ûîmQ“à&Æ÷w ¦ÙìdÑkr§ð•ùÈü£ ‰C“Œšü@‹2ÁÈ|[@_“- Y‘cÔo%˜ä¶:í寀¢ÄluýØ ²àgp§œ¯ho½ÓqìT}N.ä|*owYh䜵Ÿ¯cÝæÆÎËÀ—“¯NîXzßé V°Ùeyý6½/‰`ƒV —нóÕÊW›z^ ”á;e5¡M99M:›¢ˆñݫ޳((UaLiûóÐH‡),¿-º(L þ8žfØÅ¢n2ÁÃÑös°›ÌoÆPéÓ6²oÿ˜±÷x]&c…ÿ›5S]¡ŽNLaѽÿµKŠi yLd©ª¤*·$?‹…÷~³ÛW4 gÌ€báû]#F;GרÀQÈGc± \ó ñ[8:°KòdãˆL.t„¦ÐÚ\ûgOϵ‰Èšž/,͇ 24$oªÊš­—›™³¡ÍEyˆôLMqú>3³¦ÊôŒ¬Ìô"Mn'ä͆Äÿø Ùendstream endobj 210 0 obj << /Filter /FlateDecode /Length 1190 >> stream xœ­VI“ÛD½ëN¥c‹BíÞ—9‘Éd¨*“3„­±´8²œ©ÊïågpàënÉÓ6†bIù`©»¿ý½§~—LSâ~ãÿ²IHºNÞ%Ô¯¦ãß²I/Él®¬`K,MI0¡)S!S-5¶\¦‹&¹C¯Š~¨Ú,çœÁ¢B¯~[fLa+¬@›Œ`"¹¦Ä¢º„Ë”¤õÙÏ‹ï “qæÜJ ¡«Ùlñ6É… iÎ%6J¹Õ;tså} ¦‰@ã³aÖ=•åÌJLˆD?láÙ¥K *³ÜgiPëÎp—'ºî»}”©³°vºGŒqŸa¨ÏôÉ"®¨£hvˆÂ¬ž¢jÔ?ŒrYì&_B£Û“C.y£ŽÝ.ã—êóÈâh§ª®6wc6Ö ›ÝnïŽZn­ ¡7]‹Ô˜Ìï³qZ]wkºõR!Î(·˜À0? ½¹‰…é OWP¥aº0GwZXÆ%ºººòxÈáX™æ”c {áäí°ÊÐK%p†Â|…¦]úù¸mƒ®V•/÷´(c˜R9‡qj®Àž¡ç/½ÅÕ"y,=Ôû¿fàñ3$ÆÚTƒ%sÄ@›aØ^ÌfÛý/;ÜmËv ãßâ®_Ϻ¶®ÚÒm̱ eíÌ£*pMÇúñ;‹z WÌF¨çZyUœ;bS/Ï3ã®Fy ËÆ*î—çX°æ=D[®~ݘ#ƒÆT¾ ±2ÕS€€&ÆLH”¼¸ËÓÛhÏI(ûMu"³OÇâÌ‹ƒ‰s T Å2¼úªð‘è&ÎúòûC†<·ºFsBò0¤©³1SïwÑ8÷Ñ>Ž®PN°²:UBb.uøâŽÊòøøˆç9hŸ„Žs†¶}÷¶\Nb¢Èÿ^ ”Á X… 1›ƒ€Rê>ÑÌäÔh2~hh‡—«g_Ô•ÇÈE°9 ”ƒÓ—ÉâËÓ»ƒwGW÷­Q 7n cãÍá@àæ6Âí -GMu†~ŒdøˆÛ`ò{t¦tŸš3þ5 ½¸Mºž,U>9—Q|IY¼˜ ôSL±¾ 7%~|Sš ”Sy†X6e®Î¸Ðþ5lÌ2.à±>Ä„9’×¾.ÚÈéêϹDÍŽKË›¢ª/>ÎAÍ$Ü,%ˆ¼sMQ.7uÙí„7ŰÁå°ù€—›ÿñõ34•ÄbfÇHzñäí?'OIcÏ#G}îcÚ³mÙmër6vü:ùMœÒendstream endobj 211 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2945 >> stream xœÍVyTSW~!$>Qy¦ä•N‡ªÇѪ—z¬:Z—ªhUTÀÙW ;Y Ë#¿äeaÓ!A6Ã*¸àZ¬Z-uikëèÐZér:ŽãØvî£Yn¬[猞3óל“““sß}¹ßý~ß÷ý~ÂÕ…^k×mJJO …'¦Ïš9cSt¬\žê|4™óp¯¸p¿ò?ˇÂDà.w×3¯xòDMãPÖ6– [r–'%g¥ÆÇÆ¥ûÌž9sÎŒø{¾OD–Ï2_Ÿ5á‘»“2ÓvÇû„'Fù¬ñ]çë³>)/ÆûLIJô‰ˆŽ —Åø$ÅøFoõ X±)ÀgÕ&ÿ  S}ÿ3¸_¯áµ41iyrjZº<<"+r]Ttl\ünY AL ü‰ Ä$b#@AÄfb±œØN¼Mø+ˆ•„±šXC¬%Ö뉋„SB¸ù±@&ø«‹E8^xÁu–k•h‰èCq’øO#*ÉäÁ‘7ÜbÜ>•7ª×]5Z†Z<† Á¶9¸™‚¡ð—LQ–Øò-šÞuH$eöê,9Zµ*??ü½4ekXnN#“>`‘˜19¶AF©ž–-Ó.#/)q#?´zµNKk ðîö*r.*•ðr1Z€nˆ<þé2%ÀÁ‰J»'s¼(׌AlT0 ›QÀ¾ÛfGj;­¨J¬ÙË (,j]õRê ?Q©‘]‹ªp;ÊÛŠB”à´F†Ä,b\~ „’núZ+¢š~¨¾ÙwÉû"‚ 7EñyÒ_vcXx·Èƒc”uÜL»€3¢]?ÿ'~4ðã€Á 2øqr^rg h4 ·?ÛEÎ/‘¨c ƒCB¶'nƒ0ˆ´í9–u´ì‚¹ÝÒYzÆq´íØ)[…N¹5ÌV°QMâÛ^{“;†f8Hô@8ˆò$†2½%Õ©™‚ÝüDÞ}>/€õÀ´žB=§P/ n½HŸÎÔò“É<³¯RÏÚØW»P¡Ê`Q­-(Ö.•ÊÚÃOMÞø üœx>,žDÞü,´Ð<@è·VD’¿PÎov évŽväÕyÞ¾âåttÀ‹ËA2|já=ÞÁ¶Ðtyy¿”šÀOVЍIÙ50«‹BiŠY4§z·+‹Dø¶tÓT@#ú½¡ÔÓôÐhf S&!ß|)“=oÞRˆ„¸šÌC6г5(Mz°çLS|ÇæìáE @ëx¢‰–ÛÐ?xÛ‹òá–pã$¦æ”¦0,`?y˜¹H)?þµ_i@D•†aXÞÕ¶ ŽC'CcAgˆ©éKÊÍíõÈWZyïìàg`tŒN®Ð¤h“ªsíP æf'] ¡´¬ÜkVÚyâæ !7—”žN=PP‘Ü]QT¾foÙûæ¶–C·¹@Á,­Œ,,Ø«7YÙW«î³Uzgq4P ¹ ­VY¨av5F@.ð°Ý¯ @W‘T+oLiP_ɳkÿ£X^´5ôåãM7@ÇäΦSù×óåÎDÓäÎ’:]iÏv Ê¯OØ=©dN3()íÃø  6¦¨1¹»ÀØ­7µ `©å°¹3±cWgp嘋ƒ•«5 UÙõжS½¡Zvê[ÚzÊ›á$ôDåÎ&Õ1[˜̪zA|üU(I)ä}—zÑ»Nw5'©%‘LMøqo\Ü·ïÉÏé‘PÊ鹋âC¼·C\[É©Ò÷úÐó:.Fçì(æ°… õÂÇFZpc#m Þ“u]•b=áeÊðw¢:ñ±*Ò[¶}ú+£è%ê…lH²,lW„ÀîýYØ.,[ÝŠ"¤F+è÷Vžìë+ÙÝМR]¡Ú¤ŠpbsžàÃíÕ_€ ux¡ù‹:Ä}ÌM’˜éÅ ºt ç²™C·7[›JèŠU ~¯“ú!{q™ÎFÚTßV09¤¼ “ Qú¶ø ¼TG â6È#W¾4å§tÈ©n6VØ •¦úìÊtÈ„´|M‰M¨j=…ÓöÔÙÖ³¸·¤{ô•à”éɧL[¾í¨ó¼:€–D~ëEqÜ*4 Ga0PŒ–Q‡øú)b`3,/åÇrg5vßšÆ42Ñ~ñçJuì›ÃŒT“\<éa?qc‰Óp”75Ѓ\»H/F¯þÝ…Íg Ë€.c‰¹ý84ZªO¾¦ŽÕ*†ÿð {:î„ yÆi}ô—Ól˜²•—qTG)¹ýO]wŸûADU*Ÿ•W,/Ko®Â`ÝpèLÍà%¢mz¿»¶²A­¢ÖóÝÞÃ×C®oí éÝr‰®'÷B¯åêÂä¦HØ*usÖeˆz{I$Zb"X¹·/,X™¿˜¤&(U¡•ѶŒÜÜ´]ê8Ìݘ¹6;2L‰aÙrÅ×ÈùríÙ{Ãܦé n$©ti㎰Þ;w}•^fÌq˜šõFcmMMkÒ!Æ ßÁÍ+{?7wvÈk·v˜ªp¯au¤B«R+˜ìrE%”ÍÂÖ’üfžh“Õ»3S ÉI‘@Râ ¨ü‹±–¤tŒ©ÁÜl­+«hl삯 ûwÚtòÄð(IaÐÂmSa2ø÷”žÆQµÄr¬»ã(‹M:'ÆÝÈòæ’OF+ú‘rOWW^4]̓ y,©¿î‹¨»ÏêiîpÕ &¬êðxôóæ« $çéé²ÃHð“çÁþš~íß¼¨:Ìj`L–Nú'Qòð™B‰ºh;ÂÛŸž)dÛ µ¸UGSžÇ¸ûcCV}ÄCj’6U“lM9­P×h¬{ƒC)o>¡µö{Q·¸|X È!ñ4ý:Z¥3hÍz–ã­ó%×zŽlz{ L>$A,¬7äé1|«®DYœ¯ÍÌQªø¹¼‡ô&—ŽÇÉç2ãÂ"ÁSfª|òÞ¹×Z˜,šÙ“¥ÝóÛº¦bú1-8‘œ0ÇbŒȉñÑÛ¸ˆð˜û¼£\Ä —ýÛ]õhŠ:óâ:§Eë¿Z^ò¿NÔm/š¨ÿ;u<Óç‘à{O´ëî­»^ÿ§ ŸòáãþìÚd> stream xœ…’mL[eÇŸÛö^;Vë¥@3×ÅæRdb$Jb2y[ï¯s–a»–ÚB‡ ƒÚSnGqÝÂÖA”2FÃP7¯ÑDçÄéöe–8uq¸˜‘Lƒõùõ.™·úÉ„ÄÏIÎKžÿïä(¢RŠ¢RJ˪m&{µ­eW¶¡ÂÜÚÒÞiwžÓ)1C!nSöJõ±Û±J4JШ¾øË£EûV<¸IDIQ ­ÝùgwGË¡ÃG¹²³s 9¾Ì™»¹×²¸ÓA›£ËekáLv W’U–Å•;ºäb —é°sfëaSk3çhæj­û¸ºšÂꮸº¢®²fGÖ†hÿ)BhgGsu!U¤†“RNy1¢"!JG…MÊ\H|¤ØÉ©^À'#"%Ø–µ+Èä"s“W09•M¯ K7ƒÏæý ©à4õ™ìÓØ§¤¢ÁAã9˜„à;úÇ;8Ò¥f½/=£‹˜!#jyÔz‚œ° a,œu-¸—@ €}?ƒ;ÕRrÊQ‰+¯ßMÐ>×¾„¡´ðüÒÌeøÂ{ß’¶¨QçWx=‚#¢½$Œ01•­M¢JwòJíìЮ#{Ô^fâWš]òd¨k€!‹~ŸtM–4"Ë/Áw°èÑ ô‹L‹iV{ëÔ¤ï¥tö Û›?蚃9ˆL-Çuwñqݨ€ÎˆöO$¯#E-‡$•uŠ1¦ |伜σ¤0“˜žgÒªdšÝs•aURt#U¶ô*FéûŒœd2gÿ Ùí¸iò¶/˜Îƒü^÷PoÏpûЛçÍB§Ê â󜴘Ír¨CÃ4¤²«±Ók:ÿt @7òôº›\0ÿÕè·¾éÑO÷~s$²ZÍ>XŸ¹q=x3ͽ#½ jé®l½Æ°Ñ̇÷hƒÌáWaô˰ <ãBšùçé»Ì¤Ì²NØF\ýe¥Þ¾óÌ+H | ¿Á{k£AµdŸÓõ¹ ¥m ÎcØ2,ýƒéà.vÈ(w×Å7˜.ÆkÌý÷¥²wb7SÆã÷q 'NÝzû†¤}ÔY5Œü’ÇÛ ªÌ– Ù׳ë4û»´{C_q«çŸ?ÑBåÏÂg ?ç†ûr¥÷ÓJâ3I<&ýÿ Ø+ßÅS'ƒŒ€Û7?‘ ªuh6fóï÷ú}1ßé5aìKžOøNŒù5ò7ÉÖØendstream endobj 213 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 601 >> stream xœcd`ab`ddóñõM,Éð,IÌÉL6Ó JM/ÍI,ɨüfü!ÃôC–¹»ñçäŸö¬Ý<ÌÝ<,~úž"ø=žÿ{´3#cxN¥s~AeQfzF‰‚‘±®.´THªTpÒSðJLÎÎ//ÎÎTHÌKQðÒóÕSðË/ f*häç)$¥f$æ¤)ä§)„¤F(„»+¸ù‡kêauŠ S…C$ƒ.3Ð; , 'C¾¯áûÏ´óCãêÙÏ¿¯^Íxêí÷ßo™¼þ®"ÚÝ5³²¶³¥©C.ÏÄ%;±›#µ`áÖyNY'¿ú»ØÔMæ.X,9sÖây«»'t¯ì^X“ÑØœ×]ѽ´e抋7 Xá™QÑ W·$u‡C7Çov÷ßÜmýM3göMœÒ'¿äÎùM{º9öÌÊΪïnjΑ/Ñ+5h«¯IMÏLìníÎï.™µiFÿšîÉKËg”çç–&*Ûud˦Uóäæ'îÎ?ÒÍñëìwÞ5ò|ÿ™ý¼º7ýø¸‰ñçäïý¢S›'6Ôu´Ô·ÉÅýfÔùí´Ÿ­¢»³»¾ï»ÜC“×ôNùØÍ±xz÷’¾Îé5Å…ÝÅò]n=%Ý…}%Ý’­ÕÝE53ºçÍ]Òݲ@¾»±»µ½ú·øŸ¹Mé-@¿”ÔåçÊÿXƶ´»§gÒ¼©Kn~éžÈÁW¶à‡óÔiÓ¾,`[͵[Ž‹%$Ÿ‡³›‡{eoOoO߬9S{&÷óðl˜µ¨§§gÊÄþž¾)<¼ Ì+endstream endobj 214 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 449 >> stream xœcd`ab`dd÷ñõM,É®ÌMÊÏ)¶Ð JM/ÍI,I©üfü!ÃôC–¹»ûgÉTÖnæn–? …¾—~Ïçÿž-ÀÀÂÈž[Ýîœ_PY”™žQ¢`d``¬« $-’*œô¼“³óË‹³3óR¼ô|õüòË‚™ ùy I©‰9i ùi !© ¡Á®AÁ îAþ¡ÁšzØÝ†*šX\’Z”Yœ c```b`f`XÆØÅÀÌÈÈ¢³ýû¾ÿÌVi ßËw2þ,ùÞ'º¨´»VîÏe¶ÚÒî’’…Ý3å\f›¹°{‘<ß&a'†‰ß E»çÖOlìÿ­zZâ»Êé©ý3&vÏ“œØ¹$CƬïÚ½s:åwKVv×ÖôÕr4²Ïú­ó[ôiÝ”Öîv h}uMŌ֩íòßU|~«x7¶×µvWH¶ö­“û®ú®æ·k{{Ë”’ÅÝ˺ûvΩý®-ñÝzieo÷änɹÓgÏ’çkœºyÂO¡å›²íäÚÉ-ÇÅ.bÏÃÙÍý¼¯wÂ䞉ý=z¦ñð,ïë™Òß3wZÿäÞ^±É¶—endstream endobj 215 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1429 >> stream xœ]TkPWÞ°‰€òX(ÚÝ-3Uk«3ŒµòÁL±^¨1´<„…@Ñ|.ˆP  IÄÁ–ŠV;bÊjµ®E:ŽNkiQja¦ezw\~t#*´{wî̹÷Î9ßwÎwŽ‘¸ "‘Èûý¸8:^¤HÏÔ媴ÎÃÜ2·Ü…{] ø®ƒ®ÀC <$CËÑ­>Pë S=á/D,%gÒQt~‰V™UD…†„¬ ö0*­„Š ¦äªs胅9jJ•÷%Ž ¦vÐ…C5µŠÎ£ÒÒ³T¹A%¤ï¦ã£ñTŒâƒÄñoÿÖKAw:¿ º0S¡NHÌEÈ.D¬@Xd="G6 ‘8ÄC ‡HhdX*p‰¿+žÄJº\QW9<½„³eàOŒh˜…ݬ˜Ë„¹8ôžâ%¼$xïÍc“k  t™üúÛêñà¸ðˆˆ¸»¿~ýDZïå!„à€×2p-o2 ŒÏSv…ë‡ùseNWž¡¾‘º¯$WM`S½•æt"ÕkA®¦˜Éó³Vå¼×£æ`³kžTÂ4t@u®ÜdPôtbä6ß·£åÑ›³~½HÜ–b>ß ]»3ù΂ðwÑ—,ì8ôñ ¸½è‰î Ú,ê,PšNä÷¦õ(€Œ—¼¹†Çx¯'«¡ËÍ ý$Ÿ“"-ÓMnh!á&´¹ØH>”óÅ)aaò[¿MÜbïß=ÿÞvg4À@•N¦Ð=Ïî¸>ãªðqé\¨‰m|;ÔA?iПé–6âñ‹;}ÁûA%Š ÀÊ$´èú΀Žv‘ýh£š˜]„–8z@3i›5h^榙äHs9]ßà _ÕkŒ§1§„Þ8ø›Ç;rNÆ4ùçÕÆ4/d=ûäC³¦àQ]ZSj2g’•¶€nMáqÑJBÙ¡ÅB26…e®)0—*îI²ŒŒì=ñ¦{ZâØ©ã¦ s"WKõ@kkh©îo".eUZ…º„:^tÂáKFaÄð·£p˨fÔ§w¤˜U°0–-9Îîñü®ŽóÇ;‹í‰Æ”*õ^sCLú¬¶½Ë‚¶†oÜßšÝ\Lb"Ĩ/×i@–YÛpX†ñŠØbŒfvÀ¥péÌÕŸ ,‚ý%ßìþüP½Ê²预 pTÔ”£à°Y†æ* µ5æÚÆ•g‹.ÙÄí±q ¶òÞRkGSWígÕuùG¬µ³©—äcy1®P*“U_Øõ“ׯ|µ'‰€ÏãÊðý+W†Ÿ<Õàp´Ý- à6 #`9§„lçïóˆ…ÛYÛ.(a’k{Œ; ñã" ©"**3Jipaèø´¼“8Ü[Ôa0ɰ™ýmÌ@À/[ðnê …2w eîž5hç-èþ\ŠN%“Z˜}O² 8höÌrèT@4m9­«¾È®uÝ8+ˆþ…§ìÛBDÁì1ŸÜ™úêUæÎ´TOG (.Õ†Û @ ÏµÇÎkºòWùÅóêƒÑf¡3I,„ä,¸Ug¡iަ-:«Õb±Îug`D?°ÂsǸ£øKM/C³+*²ÉHé+µÁ×f É Z.bžg2g€þ :Cpmd¸OÑ]Ï­Ü=ÜæÎã z…‚RÛ“““ä—ÿ!à›T@kw¾"ÿûj å=­ž~4= 8e“¶t;ù =,vÎ?ÛÜèà}¹º™ ]0£|g ‚ÏyûÁÜ´Xb4qQ&¸ÙTkB7Öp“$Ћ€‡ûÙ–ºjçw²½¶ÎÃãLGMm}u[uã•Ó‹ä_ÄH endstream endobj 216 0 obj << /Filter /FlateDecode /Length 587 >> stream xœ]Ô=nÛ@à^§à Diþl@ØÆn\$’\€¢V† S‚,¹}Þ{²S¤ÏwçÛ!výôòü²œnÃúÇõ<ÿê·áxZ×þ~þ¸Î}Ø÷×Ó²Úl‡Ãi¾}&=ç·é²Z?}›.¿ÿ\ú€ôã=ŸÞúúçÖïÚÜ_šÏ‡þ~™æ~–×¾ÚcÛmÕ—ÃÿªñþÆþøùÓí¶©ÆODk*Dcô¦BtƇ¦B|`|l*ÄGÆ©©'Æ}S!îç¦BœM…x`ìM…ØM…ÆÎàa#žˆ›¦BÜ0¢}ÁH0´o" †öM#Á¢©ƒ1› 1«©‹V“×è5XM^£×`5y^ƒÕä5z V“×è5XM^£×`5y^‡Æ%rŠ—È)rh\"§ÈѾ‹à$8ÚwœGƒ®&M:ZpµálÃÑ‚« gMB7 lÚ(¸QàØBG<º. «†V®X5´rheàBÀ 00ÌÐ@ƒMXSÞ¤7ÑBªd‰Rm$ÛH´j#ÙF‚žâ'ù zŠŸä'¦—š`r‚‰é¥&˜œ`â`R‡“<œÄôRLN0K“À.L¸0 LàRÀ$0K“ÀÂ×Zúb‹_lÁZò½kÉ[ô¬%oÑ[°–¼EoÁZò½kÉ[ô¬%oÑ[°–¼EoÁZò½\ X4%QQTДDxòîøº$xðBúº†ùãzíËM·–n%^F§¥ÿ»Ø.ç ßP«¿6Œendstream endobj 217 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6918 >> stream xœ•Z \×ÖÄL§î2 ÅV\ªÖªÏjݵ¥Ô ꂊ⠢²o²…% „„$'+$ì«€ìˆK—ºÔj£¶×Ö¶¾.ÒÖ÷úuy}í»Ówí÷}w¤B_ß÷>™ ¿;wî=÷œÿÿœÿð ¢<<<Ƭ^³&9)ycBDRúó³flˆŒÎHˆHîLæ}=ø±ƒø§93->Ö/"i¯_ÐÌ53ýÖ&g’ÁX¿©ÉI~»#c"¢ü’£üB"·ømÚ¸|ÃF¿•Öm ÞøìÌi[¿AŠ¢V¼œüʾ”å©+ÒÒ3%™Y»WgïY³72*:fCìÆ¸ø„Déó³åsr_˜;oþ‚ '.š´xÉÒ§>;mûs;¦ïœ63üOd¥ Ô:j"LM¢ÖS¨ÉÔFj Bm¢6SÓ¨Pj @m¥^¡fPÛ¨eÔLj9µ‚ZI­¢©9Tõõ*5—ZM­¡ÖR;(/Š¥Â¨'¨pJL¡¼)Žò¡<©'©Á”/%¢ÆROQOSã¨Ç©!ÔPj 5ŒZJ §^¤FP/Q#)j5šZI‚C¦k=&{\IJxú{Þœ+¢Dõôúüc;Ê<Ë\{濽MÜ \‘ÏDŸ®'ç?ió}Ö7c,5öÒS£žºúôÔ§ÓŸvŒ‹×å·Î¯büðñ¯ŒÏyƒ#VnX½p!‰ßæk_V|}×ù10ì ÛÐþ¢"°¯.Щ̉¶:‰QxëQqE©†˜>1P(Ñfæ­àp-T†yÓªÝZit‚¹ÞTSyŸ3Õ˜ÈÄÐIU»ìM@.B:š=®Ü¬Í*ÌèŸ.0×™j‰_,m…öX`ñ‘A~Ý6›¥y„õh¾É?óf§òÇù¡bS­æµ°Ve®¶vr¬³ÍBÖ÷Ńú{äÛ pS9q“›í)$w1Ø“&Œ±SÿRyû4ÜW›V–Ùõ°¿Òr ×‚8áòBƒjû“oÞì}þ¯—ÞtŸÌçÁèþ‡è Ùg‹ë?Œföƨ7ô¡ôA'BcïZ³ËµZ—kǺg™è>DzŸ»]ûµ‘—Éž|:-®ú;]—` ,å’Ì¥E‡ÍMÝm…?ƒ-QŸ¢ËÑç´Ao`œœÑÅÁ4P˵ªÝuáx1D/TGKÿôcNüDÁ\åfuÔ®¸Y°6•äÝatÕº’p£C:ÓJ S[Á•†êî×£Ïèš͆c.>ÑkÚUâ¸xg°3ÄyŸxÍÀÇ!/±©Ú\q ‘hsk‚óÓáE°672ì®#H)B ú;‰ Æ h–)¿ëA¦–ìM†å E/ôù·Qð/ÛsÞµÒç.Fߟ[pïõŠ·!!¼ÐZ4s?šéÍîãËÛÄ–ÖF¿îöÆñwy"ÇŠØ7Ÿ—-È‹÷]ÖKû›hÿC<ÿnö.l“>÷^Ùû(¼n?Ṵ́«â ë Ú÷&])©Í(^N¦$ÌóäC…*æ"Eßåå"D Àç¡þœ!÷`‘Ùý‡õ>&ìP%ᇶÞE[=ùËü¤‡©?ÞŸ Í4žo‡ Û¢æþ>'¥}Žm¥ÏãûÖØZ¨ŸØUÈý…k}˜rȦ… S?£íAÛ=ùü3Ä¿i$½3ø1:[X‹lºj€9IOÁ§Dzš4Ç4G .éKb Ÿ Ož¡Q­ÆO«2=­C§D'ûäB:¹ûè2uÐ fÜÃ¥ƒìÈ‹ÍÑüô‘{¦ò¢zÆ@†VãǶœj(…n°V×#õp­Är·û]X¸îðbwñuR‰—#@iQ™¢®äúžOñ$ØÏ@^€&±FÚ@Žßb+ê6 µÆrCûpZa¥Ï‘ò }åÕ~ÔVø­¶º˜ä…†&ýÍ••â \%¬Ö\ç.a™Z‰PÂÔ.j£Y¾¿ïæõGy·‹ZQýùaÔ#œåX‹¼Âüv‡×=´‡Ï<òYwwí]ã] ?MG[‰ þ?XG i…¡²¢”Ùy Þk4u…5 ;šÚŒT¢Fš}‚êŸGSdv0å6a½¨D 1Ï—µœi£ïâ_Lùz-€ÀÞù9©‘!Q:™ Èf,#p¤ͲêT_öM¿}™]˜¢Š8°ç$|Wg-AR~;á1Kúʽ%Ń4 yˆ-ÍI &Vä뙹ûv¼ ó`ÝµŠ¯ŠOG!_ˆWjbªä „°û«,-Lé͉Øâ±²9™xØ‡Ï /@ãà­oMU½ˆ_è@•d—“ç€|!)`]ñ@Bŵ»èÚ àônR ä)Sp—-OR$ ;†JõVuCªÃ7öy¸ÚD‘‹Éo1¼û¬ãác>…3Цí8ĘkN/Š4«Ì%ªR(ƒŠâ’r³±ÈZw†d“ÅRÜëø X¨/‘\ÐïuÃùwç=‚?Y¿²òoý£²²ÏNn‰¬Ü>؃È&¸SöKÆbÍþ‚–¬º¼’Ý-Ž¢£åŸ¯¹‹‡¼»¼&ot™žÚ í«T—ؾC×PH®‘f¨"ˆ®¤AšÄòx†ý«"±´QÚé{ ºÞ/:ÄLA?’Î;dý,`^q=yƒf?§¾†Îà‚í}¹õ½29s¿÷fü®¾’>á݉' `ÈÕ»àáú‡U;u_/67g×'_¤d&k’«3š¡šêÝpué^;Ӝ¶Z´Hl¿œôš²,æHJ‘õÒjnOi|WñqÛ©wN\4ô3 ú »º¶·;¨G\o‹ž9¹‰1]¡¥$¥{œ%²yŠU]¥!Ï}ÜõG™„à¡›ƒ—C¶›c0l]äÓkÆjc•±:¾·UÈÀ\o¯À°–z°•—·w%ž—^Zû/î¹U:)®¤¢ïܵ¿'ª=á4—E¡_ÃÅ7ø=5»"AcèfèrT‘ñ1>q‘ #Ig”–1˜ FCÃ.k6gVI|Y}:¤æ&å¾ô-ô œCÃJ.“ÚúÿÍ¿ue¯Îðp*‰Ê ðI\Ìßé×úÒq ,PÇ1ìwyýú_Ûù¸ : }y`7èj8z@ý[ªêðjBÛñòñ;hûZòC(ù°ç¼Ù3þ¼½[ 4fÐf4=&êꃌ¿¢ÍBîúâ™ý)ÀöøwÓ8O¿€~ê=NPKOºÌßF“œégX-• !÷|ûZZWªÍ’&¼2QQÛèòO¾¾%b•Ô}ü'›O¹ßò=ŒÙGš•¾vÈ“Ohí“Lc©ž„ÜmƸ[ ñ€áG‹óÃ—Ρ¡ÂåÍžä«Ý #Ž" gª%…o6$®ܘ½ÊÎÔê8¢ âåÉ ûI«)²}ãû(YБ‹îÕ®ôu¯¯N K¶¢•{²§âäñ£¾û¡$G´˹¬GóÝíß=PÑC¦Ãÿ1]8ÍzK¸<ø°P±¥%Õ ìk²´´@s9s£ùèÖÖcu–FµæÆ¢#æâ†C=Æ.°BÕÜ x5–öæÆÏÑ© ¶j’eÏsêh­,RºW¶•ðB uaš&±Ao‡&=¢´ªMûð"N“Xv<éPúYÕ puc;Ø4"Ó ½Úû2dc_äfÑ_ðUî¼á“yª¼Ðy›™:†uJõ&¹0µJSA”ÇkÖS‡–=XÄÍÍý¢ÈkÉ¡“6ÒŽŠÍM}領Yšd+é«§uû­#7νs¹ìãZ4lÎm<HP>OÕ¤¨":²©ÊÜl,Õ•Õ;Óö6qàÜ)›£X¼Þ?[ðZNQ Öh彯bÑ×èý>Ç£-Îwˆè¼ÐÖò!Í€=ŒEçšÑbÎÜ\ü掖ð¦5æÈq‡0¥¦°ÐS:u´&nžË©öØã§¯Ïß¡/LÂ+8M’:OÖõzl\_À·µ-Ÿ­ÅoYš+¾ä¬M‡*Wœ04ôÑÔ‘ñ2ÚæðºÒcè!ªkñ~oEâÒëQÖ¶^<ØýŽílÙ­5Wðc€‡ÁÒíy+4qõòZ—,ÍÆòB»ÖÔÝvt±ÌUx#º L“(‰ÏJIÕEëÖÊ@“ÔKúc4kûެÊ_Ÿ¿vÕêY°üK²[-ÅVÒ_5ÈjSIªM•iâe³¿XFò†¾®¸/XÉ+Ñbce^¥”Tm•¦@›œ$•“ú­²)JóËrHs¶¤©9鲸 m¶NZ*%û•@Y»«¹¹²ìP¤,É+É­”t’†­­²©ª¾¢£ÞTÝKmÊÁ?EÐ÷é¹Ès;Ï™¹£øF´ý!—Ò$‘Y;ÔÅ*É4Á–>'Áÿä¹z6SW¬j(² š)Ñš\Õ?/¯¡Ù jDQЋL¼´MŒSiÔ‰þ&r¥Íæ ®$1  âªÖ~KPaª°Œv´CªïWê…r¡ÔćãN›]˜ÞNèe±ØìíoTŸ‡»Ð ’/^´n>)IkŠ³Þ¶ZlE¤Gnɬ”#ƒx¥z¯|Áåh0 Ñ€è/kg/>]Dƒ/’æÊƒ_A¬´IL]@¡’ºû¨»÷ ÊfZ£V“ýÓ*2›ˆ}¤wk->¹ïì4bá“€gâá±8lÎÿ>à;W_>øSÂ1Ò—Ëç¾´á‚Ä“ùuƒµÁXn¿è|ëø^[•û²`ˆ]Ÿ'&Üâ?ìK馵•ÙP±P˜¡ÍREpî"צRfQwáÕËð¾l=pö¤íò»¯Üšša0m‰|‘rC÷ÖÛ) {s‰$ 8×_:íÎÁs^ð{•ÿÅÄ #âü +Â.Ú`Ó›¶s¶Ó—O|wàäve(‹‹+^Ú¸€ÜYÏ•8í祯àk8¶:­`ú÷àsùËbûñøâ\È‚Ea¸‡s:Hš‰w‹«ÍU¤²¡]ÿ~†û€ /¢n’vF:Ûï\!q¬Eï‰ õTçtA‚áÇdâáY˜¾9 " ÙÛU§&àQÓ§>Jˆ1dUZ,V«©J`i ‘´žCÊX¼u™Ð°p€&¡Ñhô¡Xòꆰ"®”Ý*ÿâ“s7àuhH/ÍlÚkÍÊ[&˜R'Aó¯¡É×мL¾m[»b ˜@ú54Yt‚.%´võFÒè±’î » |@™¤Í‹ÁùIÿrôE:D£Žé‚R`®Ðx2‘ýÓÑx¤^ Í.É©ƒ6(n1—D#¸ÿèÆ½ ¿?  KNr*ä 4¢Ñü~°¸¨;¥)"!1A“ ŠjJi‡CÐÚFÊÛ|áo aÎp¨É—'_€^ŸÌûûèD{¹ŽÂãòâ-ŠUž6W›^&9 dÜRkwÙ‡»n`ÆníîÓ P˜ª•ª#9,Ê}é¥Ü— Óò0…æ'Dbn¬WŸ²šK‹ÍûÍÍ’ªLͨBÕNù‚7_D´Bå’ÐmÂÛÏFS¥õ‡¼jÞû¼ôƒÃQ°8ľã`ñ©âo¹dg~~à-Vn ݨ8ˆ’¸Ë¹]a[˜ÿ‡þ".y?µ=’•„dM¬&¹$æ$dlÚ•S ÖÊTZ©NVšSõðÓÙ4Ø•ó3¿›jÅùEØŽ9t –U›j|ÌûsJ¥ä$Z½T‰ÿïáòÕ²m–.ת°©Ð)É•)z)9u¥æý.‡^»{̓?Î{´E /Sðw´¢\Àè€þIâÜ!Ä9O'“âôáôÄ‘Iš˜n— üŽ4˜Ý`érÙW‰.ˆeêe>…"¹<›–¨()Hò ÓµY%v²ã@_Ãy*Á>ŸÂôª¼JR'͆ O¡=œÝZNÎã20PÒ“ØX¡6KKñ OÓñCÕ÷4=ûUuI±ÙXa(Öö%–`n¶eâ¡mÏØz4འÀ4­ÖPìZë ²Öb\-šðå¾·vß :—FTD~¦¾@'³©,Z4{äṊ œ)ëð8"f‰Ã<\4xè¤ëý®?zÔFþˆOûHeR‚J냗-‰Ì©í®ðAsßCãƒÚe§ã«|žîÞÅ›4ñb²óÌýg;ßüeŠØTGÒ_äË r¬ÿu—/Õƒ¾@›]šSKÒŽ½¢¸Œ_ÿË Î^i7Ü•@Ny^܆Ö.FÞDñ¿@éúS‚¼öcì-ü‰QL#Ñ“­(ˆYU"NÅSçá!Ka)„¡!hjšüùw·à&œy6 OaF(JøWJÐÒs íâúôÁ!ÉÇaCUZ Â?K­Ù:lØ9c‰¡´È`?k=`6œ¢þÀm endstream endobj 218 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 328 >> stream xœcd`ab`ddóñõÍÏËÎIÌ+14Ð JM/ÍI,ɨüfü!ÃôC–¹»û‡ÖO&Önæn–ßw }/üžÇÿ=[€…‘1<§²Ã9¿ ²(3=£DÁÈÀÀXWHZ*$U*8é)x%&gç—gg*$æ¥(xéùê)øå—34òó’R3sÒòÓBR#Bƒ]ƒ‚܃üC‚5õ°: E°°4¿$µ83/='U¯¤ØQ±‹‰‘‘Ååû¾ ¿,û¾«œñ‡Æ›¢½ kæ•ts´±•t•Wµ–4øty5{w7¦mê^Þ=y]߂ީÓL?4ó@ï侩=“9ø¦ýpžöÝvZÿ4¶\¸å¸XBòy8»y¸7ΞØæ÷Oäá9Ü;­gú¤ž©'.›ÊÃËÀlŒ€¤endstream endobj 219 0 obj << /Filter /FlateDecode /Length 3563 >> stream xœÅZYoÉÎ3‘ŸBàa"¶û>6QÀl°^`½ò :Àˆ¢dn†"MR–• ÿ6?$U}Ìt‡’lç°›ìé©»«¾ªæû1%lLñoü¾ÑñÍèýˆùÕqüo¾ÿñ|ôòá°Bul|~= ¯°1×’P©ÆF℟¯FÕëz»_ÞN¦BpXÔÕëÍ'\'¬ÞM(¡JF]Õ,à‹ãZ1Qm'oÏÿ l¸ÊÙp$«°:¿Ubrþ3l‘lìˆÓ\㎩”(áÆS¡ˆÕ7^Tüôídª¸"h "s‹)3“©d^vÕô»ÛënÇTK£ãNixŽ"1†€4ßΔEIÙ)N¥lˆ5TQöädNNÔyBPåœ=JNåäÑܰ°—Q†g#–i¾˜RŽû@mgQFá¤É7ò|cgךAçŒ4È-UŸ‘P¨wÁHé8ë3j7ÙÛäŒ,üË{Yb)ïR‘1b„»R"žoDFSE¸ V§-Kˆ1þ`¤µŸ_ĽÔ{1Ì â![þã‚»ÅoQçÎþÀ^kEÆ(UA·Ö\ñœ>AÑO¤ŸÖ8ž´Ž¼×C‹ÖÌ\‰œ“ƒúyœ1˜’SæP®dÎÉæ˜ùL›ÁáO6Ïm¦rú–(äÏÕ¤]ËÈëœLp‹S¦*–ë²sGëæ«ÉT HeÎT?—û<]ÇG–Ym!_GžªZŠWÖ“©ßÄUu•-ŸÂËŠƒö¼jÖ7luѼZ·tEÉïã&{Å<æ=Щ/ª»lÓmöyyí¿('­«æ!¾CeuƒB¢™¸hå•ä Bq[ ’“]çün¼âß„ªÈdj¸«~Xï‘‘Ñ¥eê}8‚@y‹¾Îœâ á”7pSoor¿„`" õ•›X(ëP(ËpRÄhÃ\Ør>PP2Aí$X`¼ˆ|ëSSï—1 ¤n·™^Xl×[ô‡ÃÓÁÊg& V­Å¼ËüQï1mªý:ž¨òùYМH¡£~ìˆ~Ü2‘ô€ÜÞ~ç¹á}¸3gMûÊBu¢@÷„žç_êÜß»Vj 5IiSú9ÚÐ Ôâθ¶8E]â :í¦åÁ«Í!ÕBÆÈb¹[®³õ•ŽsJ¬Âêá&jÏ­‘Z”ApäÜ¢¹¨séê&Å‚öçCRĶ¢§É}.÷Å4™`\}{5ä?ΉâŒ%ÿòÀii9/£ÎöŽÔ"îÑÇ|¹Ë¨Ô¹9 Ó®½^Ö¸êãr1Ö ü .ýg(¥Z>æÀâ–J?éÀø%80°‹ÎŠ€Èùìã&'ʤ”Û*ÉY¬87$ö¡ó5 CGÇrÜ{rµ¹ÞºRít›j†9e^T›6rƒÓgÈQB1Ÿ¥Ê›«^ƒ]BøjJóà²öð¡t{ßm‹U|ÅJˆH“z/ l„4XçL®â.8¶÷_g ($$ïe•ÛH$Ýöv»,¶zî¡l!·ÝÅ÷BFmг™Ñó`Ž6¨v+ТHQÉÿeyZiôcõÅA%®=¿³œv[>j «2•>µp†ëxœ…QIë° ­!$·+ /„ð âxpÑ7›P„5-×bá¿ô3'Ëø³)9Ô v¸ŽrÀ)ˆ9Â.L3hh©š±§ ¹¦<úÅîk8ä24HqxAÈGíà7y‡`ÉË7–çM6ƒÍððkÂ-uñ›?$ B†-f4œÎ&]éˆpìõ!¿C_@¸1ÆÕš[èyT‹›ó_Q™ »Ví ýê·ÆÐ´(@ùœåmñ*лž¹&õŽÜÞ­pðf­V˜ç¢n§]÷Àl‚‡´õäm×õ°ÔÅ‚÷[IÂ>¾ðŒ¶ Õ:L àJÈG¡îÔ e‘dQ¶Š˜¸Îà îf©bþË4f9åç:È ‹·F±¢ÙsXê^s8ýOl óçvATÍz©tŸ#Îm õ4‚è®øHÆ+ð1ƒÓga¬Ú­ÓgH˲*1}ñå*ÔSÂÎL@ö…!,…«R çꈉ%û ‡¾(Y‘˜+Ÿ£3˜¸ž†c‹V°®—ç›"s4¤Hî#íö c…;`ÒôÀ'8§Ÿ[ ²R`Û1×·Ë›¢Ìö#ûÕùèÇQ¢ªñöøð´w‚ãð”A.RŠaqxZ›Hö“éAb‚‘»¨>,ww?zÃFe9ñ€ ,ü÷Zê¾xœ <¬9H#¸®úƒ†ƒÞÐo3|¨9ü»A–š†–3g9iÄ¡!wÆ›M|Ù÷@œôì¶¾F% ыãlÀ½xpám°ÏgŒGvлJãàMi…·§íÈ<`Qéç>Ã"šOÊöúFªÎª¢“©w%óN9³ÊÛ/o .ú bwÈ1¸lhÌ‚ ׬V5´^¡ óçÒ!GË`µ»Ÿ:œ`$B{ß_û'Ÿã‘Ih¬nxšG¬Œ9Ú1ßÜ?™k¢ívIÃ6ˆÎ«_eÕÍ`ƒ&˜#Ь¨® íÏã%~͈d²­­!‚lÇFhÅ!tÅÞúhàe³^xãúƒ†O{g0@A‚[¸ôZ ]ClÌÃî¡Æ:iߘ— è µ0ܪ˜oÂæ&Vw‘&ÌÚüS+BPùk+{èÌp¦öþ2 GYd‘!°éá2k‹f‚›f½}Éî4XˆŒËݬÚšo~ÒÜ?lÐ=‹,«Nš“Óîx=AÈr×LJ“0—QœŠ—eGËçëæl>?íàg³8köùÂýÕ™ïvÓÂÇ›¡!‰ê\¢‡£ÛÚ] jýq±;ûö›ïz±ô´”3áýÜ~Íâfq{5«NöëÍIk*\ÎØ†b—°ãäö$ Ò»õʸÚÖ÷dUÏß½Úì:ÿý~Úí¸¾»ãA7›w5¹îÔÏ,Á^ŠRâAÖW?ßíöðt ÈÉeSÏÿÖjmubà›‘vñ^Á /ðž%ëËfy Í»ÄYuÌxE^ƒZðü×Wë»ËfA›]Ë+uÝÚ çÓ`3QX¬íN ‘C@ËÌÀõþìý4í¾\4gïï ðÍ*x´lÖ·ó·ÝÕšzwÆZ¯k”‰ +,ÅP×of×{ÿÄl8…L(5},¼Ap6›ü.q5i‘‹yÌ* Üöƒ=´Áí¨ÿ;Ÿ>©ïÔþË “;b!8…3åÈä_2™Ó»8¸Æ¬S6$ö{,“8Ç´‘¢ax‹P€Ñx#c¡¯¢¬ï¥ð= ý˰Dti×e¿äÞÄŠÅ<^x¼P{ Š…©¾çîÌS Áà%‚ëOË=?x¹±ô+`¸êòL¤!„ùº7î ²QY´ªW­EÔÒöjKÛ²…ëÞn3®E¯ÊP¹UÌó·_òn[ÀðabEð.ÂXúàóÁZÊ{mDtÖbnjÂèíx-~d޾/&²7MûÖ#x ºò‰F‹ùRc Àô2Ä#ÓÕCš=IÚ€m)ÎÁ\ÖC‡äÑÑw–0ÎÒ| ¡;€P=Û¾¾>2ƒ$-céq[óAú†0çÕWaG9dPÀAµG† yû9/šs¿’”Î&/¹ÒC%'²­‡‰¬ÚÕ› €Bà“¡«í¢yå'zihwHwå7§¸­/N§ìí33»Ôpè$íbXÖ9ao•p[HfR‡»ô£i°$ÝÄ€)ОüH!i§D_VH¸¢D@ú„ÎþÒYWŠH4½p' e»¬âÚÄ+k²µ:”-Â-X´EgHSíV1áytŽ}stÊÁ•!¾ †A}"'ËÌR9$qÖï,vIZ6°»AG‡ºûøÜA\q’½°‰߃;þ4²àH`y3^áé~J+Íè§ã3chèѹ¿œ xÖ#»¡ËË7ÊŒ-¤ÿaŠ8ù‚Xj]쿹ܭ›;?ɰÑø[4·Ä‰Ô]\¦àßYëCNk+9ÿh‘ž@¹ŒwÌ`&o¹þ %âÌ1éSÔ/QNTI;Laá¼ç\&· L.áUÿ⬠oâþÞŸü5¨Î(ËhL1S*H·5 nŠHèŽS·Øô©­HY¶ "×Ñ–È$#-º=¿âãÀRÒ¦YñQi©zZÚ4­–¸À9(-ݯTª³!qX³ý‡Å‰¿-Íc ‰@ÿ~KC¤6)¼¢Êèl€*6Ï":•lÈÑšh¥¬.]š†÷FÏ c¤õÿ ããîü²¨xJ¦åSA!…=ê¿"¢ÿ¨)Ü®ŠÜ¿[@…)¬'¦ POøÿöD^T~‚¦©¿m: ÐúY"ÖC ŽÅüXqPnè!œ|Šá¡y ‹AДéB³gßä„RáR +þÉ£ý/Ô+ó,àr„œ%êKN.(2…úèáxÁ©èlßÄHîÛ¶ù:ØQ(ÈqÕêáUxˆ ¡žÏï¶õ~áïÀd˜c^†ÚÇE•-â!™Ÿ‚@)Ó:l^¦»{ž'†³4›ÎÅ›î';…z*\ÛV\´’ƒ¤áwP-Îøqôo€¤˜endstream endobj 220 0 obj << /Filter /FlateDecode /Length 9816 >> stream xœí}M$Gr¥€½õitØÓ^šK¶ÀJ…E„–4‚V€°»€8öÐ=ŠÝÍfªX=U5Cöö·ï{fæ‘fYY$«Iaw€Æ€Ó•/_ø§¹¹ù wÏ?î¦CÚMüŸýûêúÙ´{ûìÏ’ ;ûçÕõî·_>û»/rrèSO»/¿~¦¤ÝšvK[½´Ý—×Ïöõù—wÉž[Ú!Í+è_¾~öbÿÏ3øk.ûWÏ/¦ÃÔz™Ú?üé9ÿ®kî}{yÿÆwõáùE)IÌû¼¹~ï¨úXëu]÷÷ï¾uŸÞ>ÿý—ÿ‚‚•X‰”kÝJvuóöùE*‡)­yÿrŸì™Ôý3y>d}`ÿWZÙ“4åÏ‘¤•|Më¼î¿/ŸêÜû‚ôÏ'ÿ+”g^P ýFJȬJ©VœK-NL¯–yžF‰ÿp®Ä¨p™&k…ýËç/ŸŸíÄõúzìÅ»»P·“¯­JÝÅþžJßK¿!³ óôMYÒÔ­æ<ÏyÑJ.Õ缬‡%/#ã/¬ÇõÙ¯Ýß·ÖDŒoZÚxÚ?{ùJ,±ÀŽþýòíi)þéËgÿÊÖLm÷öŽƒ"¥z˜û®Îè¢eWPµCLõ°æÝí›ÝÿÚ}‹¶\çi®»ï0@þÿýáEw›…Ê»/þÝ–Öª4£AaÇ»k h­™È’­î®€Ôå€Ìç^gfDdN‡¹™Þ,È2£iwó –A¤ã»NꇚˆTy͇̽*OU|W:žêò4‘‚Éíã R×,kî¹Jdάè¼4ä¥é,Ë!g¦31"=¡mæµ˪Mó!!ó¥H;ÉlŒÝ<£8‹T´±‹ùÒabÔÎ6˜×‚¥|m®¤L‡¬¬¢YÐnšLGùX+ êY²š§åPPœeíÖ^sFùˆ ½.yÍ­ÛX«j)ϨßR˜ò28s;d敲µ r˜Àí ¤WVÔ~æZ¦•™ÎhŒC—Ì—œù×¼ MVEÊr¨È|®ùP¥ÈKK‡Ž&EoÁN™gvÀÌbI/+ÿ˜¥P tù Hf·Y§Ža¿Ã#íP¥qVtcbi02´¹V hü%L‘H+‡”øÔr˜¥|+|OcÞ åT- ¡ZkZ¾@¥W³ÚΡ׈dkÏ®657´g’d;úuE ·ÔÌ(:Z¿0ë†>”Jõ£žH©Ö›}Eñ:ŸZµ!àEYΖAíló<¡ƒêT1,Rîº!ó²vm›<ÕtÀ(œk—G¤µ)è¹´ 0÷Cg*ü‡ŸÑ… \ÐäU“E}9^*˜µÌ ®8ÁØ’:åç²°0µiKä„n¦UÔ{•'>„áZÄ"rÂð£T³üŒ^94¡Ìl y¢ cif–Ч•ÊÔd´¸p À‰táÝèSˆ`Òæh)0ÁEÊ’1’àgf¦¦Í™×YFKAÝd¨æ2%-&"YTenZƒEŒôT˜Ì¤&‘KEX'-ÓÍŒR©ç² xDÐM9ë"c%Ã&µ!ê”iËxª°ÿˆ IV"œ²å©Z’Œ‚õ? ÃÀR–:‹µÏð´" JG :Y¸ÂVèx1¦u¬ä6q¼iMöpBÞìRq(hÇ›`M]JÓÐ šàß´m8ïD·!uh ʇòL½Ð¡é2¸æ”mpäYgpfõ¡IÁJÙ‰Às¸Lëj& ß$žwÒˆ Î¹3Ó§0$éy§ ¯ @—Ù§u í:+478Nª¾ÀWC«(c´ïÚ ÿ¦é.0_˜&bjµZæÂ6h½­êŠóŽÓ:Z9k2ȃ©uŒ;ñl°˜…œ…£˜8RÄl:™ñ¯pàh'ø›1ðVxJX86½ÁŽ+û„±‰yy`Èà)˜¸"茙F—&Yu8ðR4+™ÌrGWÉ|á¿D0z²T]Lš8\o[ù¦Ã17³³š%¼Š†m´_"0Ï”5™…ÄcžWZP2/S®úQª]&¸o ™6s¯‚4™^`Q]Gk™ÐlŤÈÊ€—ˆyÕB£‚çE:“–·$ \˜R[ÐXÒy…¦ˆ²ÐíËLÐé;AIÚ/p•c¦-꜈À+ã»Æy^æÄ<Œ45ᢠÃ7f>[ßøQŽ'.pâ|"Y8EÀB J³!´ ç€dàeGÃÊS– |8}o©„—–¦d ω þUæjKg…oD,Æ-+ãô.gs‰+\8 |Ž\8}ofeõ)¸ðŠÌáOu²Â<9Ó÷ÂOÛð]áÂé{sc¡ÃÀrŠEE¥£\ô½S[ÔCÊjN£ÑH¥:\8]oB“k't¸pôaK6Š,¬Là C&öÂYƒŽKQu‚be€T*#q"h$,'8d‰`:¢ãM˜ŒfÐeUÒ­:¢*VTâx'ÔRæÍ:qŽÀb¬w+^å Êá’`æÒ|5Á')΢=^ü‡Ë„J­Šà;,ü4óÿݬI£6D3[_K œ8!¬L¥H½òIˆ_éûÅYÔ»x^NôÐT†-ô¼X«Cªˆqd°Lt’Snâj_u´3ô£ É;£X,‚HÜQ1¿Èh™V[® ËD_VMjÉbá÷+§n"Œ Y)xई¦X9eÉHŽ«Çfcˆ“챊GàÀ©Í9¤ŠÇõøu¹YÁõ:d$6ôœ#\¯GJÈz­ ¿=€i®×#pß%ä¼"”]ÃS<{äw&ÑÌ*ѬiÚ¡[óîZþ\ŠDðÂ)ü-”«gß<£`óCŠg‚÷XEHš½äYèO1œhA0\Ñ=E{Éè#D£;Î.¢$Ltd»ß#£×Ï&¡Ä^LÚýó³Ä逓]Iñ·:.¾eѹÞåø.«† £ÌÓ$1ÿÕ&B5Y¨x¤"8Mg»!BÕΙqwÔ à&º ¦AUÐ*\©UûÜLk0 ª2pžU(R ®®©OêÐMv1 £|H<&AÁó.:c ÅÑ¢?¡FÉôÓŸàd“‰¦?IËÈŒ9ô§6Õ!P˜ÄV–C€RÕ;ªQs(^€BÊóŽT€Béf‡Ue%"O™…ÖJºJ||Ó‰vPK.ÕsL€’žª*[©…ÑÌ(g¦@¹z™%uך…VOQJº¼)"”L“— P‰l ›….7­cHP(rQ…Ì($³QT%éšu(PbÙ²¶ ž«è0(4Ö¢²ÀP ¤Ñ›"ª@Iëð0JÂT€B>¦  Zu•6(µP¯@Áye]Ñ JŠSU]RJžÒ´)P2ÓŠhk Tí#l TeŽº¾7 Jâî¨@IÃÌ^ªÔ”U&0ŠÞXë=(øðÕDU $–ÑòªU)áj"*@¡´Å´&@Á®LŒÚÊâþ¡@Á)4[¹›…âu x‡dÖå̠Ī“¦¬Êgrö dÜiÅMƒ:ZÍР*¥ ÕÕTƒ’Δ©xˆPpE­dˆP•êzUYJE(°Y÷šÕ×jc˜UiÌ“rT„'¤™«…:T J† U©†Hd:T(ñlÚU¦B៮žb¨PÅ©fa*ªUÔ  éŒv7J¼’ÚŸ©Pâ{%Ì*T¥†RU©R O“M…ª\‚‹L…b^Õ«Pbš—©PG=T(g=¦B¹F2Ô‘c2” aUöL†’+«u“¡dÜ— CI ®“¡h%*””Oš¡BmAàP¡jÆ&CѪte*íM­¨PSµuõ¦BÉ0ÓdÖîê¡BqÑ/_ŠjWDE(4ž½["”D+:^L„‚+iC¨RJ¦“·T„ª¢+IS J:A5'S¡8 MOR í0*9T(䢺”©P¢îh:ªBÑ$&¯BId¤úõP¡˜Œ¶Ì¦B0ò¨B7C†’Q¦cÊd(4F2ÕIU(¾Ãç7d¨£óÛd¨‰Ú_¡‹-ª1© …&Í:sªJz²~7J"sU;ס¦X ª2Æ\U0:T±·¼C‡’ˆOËlBŽÖ¢æ<ä¬Ç•¨ %JURD•( Gd6ûYJ”,åÅ”Ÿ¦D•j-ø¸5QAÚ}¢> Q»ÿß„¨;†H¨ì¦á47˜ë¢¦£LE6aöÄ|EA›ÿ_?m ú´1èÓÆ Oƒ>m ú´1èêÓÆ OƒvWŸ6ý%l ÒFþ´1èÓÆ OƒþÂ6—}!ƒ€Øûߟµ1¨²ßËÊ1IýÏÉ1œ}¥ë1”´L©#S&M™tvzÌ„q­BŠé1•³¯*C™ªECqúÕd(ø­ªœ¨ ƒºwÓ~† CÑRR=FÞûLª­ˆSûbï¥6A†ÉªAf‚ÕÎA™P >7A†=¬Z 2ò6A»ÏÑ=T¦SAFêÔ¼ #¯KEw‚ ˜5^‚LeÑsÕÖM9¾k‚ÌñÍÙdäEž® 2ò¢{AF^Ò©Ði‚Œ¼–PQÕ‘P )ÉÞkï6=æø®cè1®eL¹rчT‘ŽR5=¦Ò7ÉôB=Fõ–ã¬s±òŒÆ˜©iLs`A~ï¢iýØþîËÙÒâ©ÂÅ'¥À/§m9ñÝ ¸ËÊæõ;›ý£-(1ßWUÙÙÄC‘z® ­\rv…YÍN î)$\Øl³gܧcBŽkž–5çâl:°"øúr^,m~¬:¹=Ñן`m;ˆû£ùþ@#bùé‘ð2O}4¢Û§ø3vNòÄúpwbZd÷›íx¼†s¦Ê³ €žégÚl‹câŽãÖÉë#àI½HÈu$ À‘r¡Z0IàI”c¹—f# À‘°pž$†¤ ð¤Ê×K.¥ ð$Y°gG€#!~”½X[SÚgOáß«k€ ð¤Ø®Oé#¦‹D=˜û:©u!(àt‘¦£Ù2|GN|ÃcÂú+Ed'Ö–³öMmt›¸8R ÉB£qi¶_ Í“b–ÿ€b¦óivPòòÓÒL©„röG‹9Ã{ÿÄ$ùÊ÷˜äãô„$c)ïŸ.åãýóÑ¥|´{¸qö£ºü‘†•mÃù/çqùÃûÉ x²[^ª¬ޤ<ÙwsÕν/›[À“<–R²èÚHxê,e»¯k‚ xòT2pás$ àÉóÉœe3ç‘4€'O:eEWð xâÌTyUuä àÉÓ×ÒDŠ>’ðÔ9.¥¬{¢Iv´“¡rÂÙ¬UÆ#©¨,q$HU6²9’Ôäu«#HT\ ߌÏ1 0½zO²TeO³#HMrIxRÒ GÒ ®uöÙ xNÇsôs ôÜñxwà•°¤4 òäü¾†íyO»TãÔ·žÄ³òÎÎÆç@)=xì $¾†÷Í3€@âØ’Ô[ðØàI•[¼|K RÞv)ËTG2 z Ñíx’¼¯öÙ ÚÖ8Hs.yi•ÁŽd@ õ9ø‘ ð$î¶övbŸ%ÅÉo‰÷øº À“ø¾ÛO’H¥¯½Ä7t!%iÉa2Ý€@â¡AßÞ$n×ðÞmžÄ¾Hö9P–¬ ð¤>ɦö#i$"ª'HUæIÒ<…EЦ×àOHk šáRSà8RZž{©ç°ØOJi‚ÑRÑ#òG’Äí±ž£ŸeNÁŸl@ é†G2 ÖàIˆBåÔ÷F@ ­‰¡ÉO*S Ž $ÝHëHR‰²ÚR›‚GÙ€@â–=o$îÚôM0Oªv‹ÇF@ ÁÍz¾ ó²ÑxRÓ šGÒ)Gam©D)k©ö0ûn@ ñ€‹/ø€@‚o¤.{ÅÉOZ’œ¢>’HÜ¢ä[|ÄK ¼ j˜ÇgOYypÁg6€@ªsX l@ Í=øð $îôÅ€'õ)ŠkH) YHÜRâ9ú9P(û À‘äH« ³~§ø;Ò¸¥©%bóîzCü ¿3¬i–Q7À*Yü»cXrì¤z–!Õt/¿cµ±»ß±–",ËÀ’£[!-CULPËOLU6ÊiºÓùt¹_ÒDìû´’žß(òs»jýÑTûº>µ«Îo@ñ‰N½<µþó/ZÒ­~|\M¹Ô'÷ÿ¬0_tXm-ðÆÕÓëcÖðzÉ7V'·sÆæD9"²úy¿äé¸ià‹§7xâÅ$nŠó,C"«TÝo~d•:ö›YUNoyVµó\žÅ#9°‰¬YN„y–"‘µ´Ó´9‰€ä´‘g)X9Ë}ŽeHd59âëYŠD"’‘³Ê9)OR$²ºœ(÷,EbôÆ3a!CC" «®˜–!'¬uÄ#k=Gšìµ vcHd­²¦ò,EbTÉ›ÔñÆ&š‘\ã,×+²à—?%}šÕùÌϰx™­\½|d±… øÃ'xû¹—I¼Þ©ÉÕÐH…/“ÞœÕQ¹ÓšÛ¶/x•QQuúUüÑÔò ýÄÒžiøê„*¼’Çü¾Õ—ûÇ™”¨¥Âdoß<ûí³Ø;OüÕrFsŸYåûÿöîíŸü/I¿y~Ѩ<ÍiŸ~óü‚?bÒ×¶ÿ"þùåý»??Ïë^ؼHgÙÂííÍíÝøQêuÇ_X™´Ü'ÝÑ4˜Éyõó?i³çÓ_H¸pÌû›¯™! šü’¶dÎû×~`Û~™ûk÷«è—¾ÒW÷Ÿý‘tmªéi¿‘ްpò3éñ—Ëy)âl 3¹ÐF\Ëb ç›ÈjÉÑæß_Ÿ\++ÀŸüÀ²74â~üÈy>¡fŒÞíç×?{~!ûÞ§²¿ü–ع•,ñ×Í¥ýK=Óþ¼»²ïïå·Å;ü»ç¼œŒöp£_÷¾¿]Ò‰¿•1úðκvZ÷¿²6¯)6(ãÕqGȹÐãL yóPÙºæ¯Ïµ×EE°¢•ÙÏ­öûÜûíz^ß—S:éö6ï&¬Ëv9E.ß¿—Ok‹5í¯Ó#¹ðX[k§¹”Ó\ŽÖuÖ(øÓJóñççí>æõ‚FÀâÖ5£a<ØÛüHd:˜2®ópW’<¹Gø›©û1˜¬­‘>Ú¼$¨Ï§£ð4an?éµÊÑ/—G³?‰®X¤'B:/ö8e~Ûó9ß½Ub»íD&…CÛÝ>>EžŸ)x×¢â¯%LU¦‹}Þæ½šrIoá™äÓ{±ÿîÝÕ­‰÷É-û¯àø‹Hke‡º,h:17Œ¿ýÿöݤþ Qö7×f’píï¾·Ó¦¶¿¿9§îJ’lËþíí¥ðæ°ÒÕr#a6/Cӆ͋@?,u.ûû0¿(…î#mIè¨ûîæ[ý®Ãm~÷ÍcóÖísnd×)¶ÊoûK6›$Ëj~sÆ tž{c¬yÞJ,i»ù³6À|’ïeÇ9àv$Ôb:W7wᙃ´ 7øbðì¾üïϾü[8»»?¹ö¹~÷­Ëý-»§º¿|¯3 –·yÿÞ—ðfë¢ïß]_ÞÇ`äÃHaÙû„on¯/i[µKÿÇ&e|‚‘Ä>íêÞÜ¿ õzci" ŠS””cÊcnƒ ÿY'¿)v!’; Y.ïGáZ(wxðÝ©ÙÆ4ùx8SÓƒûB¼{k­Ï\^abç%Þ˜eOË* üL–¼%;/ìZ›µcáŽ/îoƒñß}í>  BWaâ(3æ+¡¡dNÇ ¸¼úÓÃ**Ÿ8¯b¡å´RÝ«åN©ˆ¡“Š»ô¦sjF o«êÁŒÌ’?ŒÌP‰×'qÊ-ÍC¾Æ¤÷ДЪžêîÆ*¸.Ñ@FÑ|MïN›öt•_;˜,bØÿøÝï~ó›¯n¾uóýËG‚8zÖ>Þœ ¹~\½Ùºª7{íºéMðeáÓm¬›؜Ζ‚¸ „ß¿zå{v•82¼EçX÷=\Í‚¯ŽÆ:öÖ#ƒmó¬à ­m¿>q÷ôµGhÄû+wÒttLTŒ¨[«qñ÷<ùâ3íëËãßÿõâø÷«¯Þ}ûúå^¾¥9ÏûÏíK¬.Ÿ ôîðúòþòðõíåõ›—ûÛË,ó½ )‹ogó½z÷Õíå퇗ÒûF?å|õ*³ñ…¶rùÕÝK ‹y­œ~›öÿgæ³—= iÉaT}~$½¾tµ¹º¼þêØ&³çݽùãËýôYìÔö_}øÿ¾|î ÷Wð¸÷Ÿøïá·ÿøhÕòO¨š…iU{õ±Ïý7/Ù}[î=_|÷Í»Wß®/Q»/ŸÿžIóyÆ›\a\ˆµÌEGñH"jÂñœIâåó_ÿúXó›÷÷ïdj6ûþæ»7Ûr½&7$.ŽÙòÂÛfÎãEúýx:ïyëü1q†ÕgŸŸó9#ײéߟþ÷Ç®¸¿ü÷wß¾_¶ý¿ÇÖßW¶>_Ëþ7Ç¡T—s¹Ü¥óCX›ðhèÁ»ë››ûowï¯Þ}‹±ºÙíÉ¥³B|v´¼×_ÍÍN߯úƒRå_¬T6 >¦TBvDê.~{ws';)S~8 ð—(GÞ¼w¸Y›|Ç!sêà1Ç9ãì§æ‡ëeù¹ÐŠDtPPé{¦ÃÛ21Q„È÷[' Ý JàI÷£IÖÂ鋫ƨ7¼3±±|U;ŸÕ¦nʼn8™{ yªì»­4ôÊ4Ydj zÇn‘Uy—Ú’ôD™'¹è{ TD[‘…<·ZD’œðü* ¼r.¬àm:pN»‚å*ï  ‘ZÁ—.”Ø.Môµz)FCÒZåA44šêk±20NëGƒ[°wcvg1òÉrB{¨׿ æb[ÙÉñ¼ô_=XTŽ\®ÿsHšAJÊâó¨Cu6­ÂÅRþ*<Éo±â«*ºåÌÃÏX„£Ž‡\ºKNžÙã:äËoÜ€8L>zºà. ú©Óµ‚4ÐRã@¸½¹»»Ù´À³Ç`Ž-ŠŽs! -æ—¬ãPÉ5{´÷Ô§av »tôÛG­ùlâÚ)*—^¤ü`‚3»óé¾}ë£üýÝýÝ Ö‡«Á³_œ®.ÒÔ¤ c<ô¿Ú¾¿ù/›ºô)¹$mSßLŸ Žb(…òæ6qÜDþ@)“ïHñ§¹=­ê²ÊTÏÎ9°Àæ¹ww#¸_£ï¿ö+ºw·qÙ~y%Ë8J*ð?YÚ‡ãºáœÃæW‹ŠGšÒ˜Îl>àtv8ã\ðrw^½¹­$X?Ýc!°ð¥_¬:}ËŠ`›Óçýý‡÷oÎF«sõ7Ÿ¿–“g}ð¬_¿øpõîúlºˆH/Ògˆkþ6½¹HY†·èLblc‘"Ævsõù«W/.Òï]-®¾{ýùÕÕ)xÿáó«{7gÈ7f¯®þõÙÿí Ÿjendstream endobj 221 0 obj << /Filter /FlateDecode /Length 14466 >> stream xœÍ}M$Ç‘åìµO°—Å^IJªÜÿvi8  ÌB:ŒD@‡ní¢ØÝ$K[ÝÕª*Šäþ®ýIûCÖž=3ˆìÌê.’’f »,==üÃÌÜÜÞ Ë?í¦Ã¼›ð?ûïË7ϦݗÏþôlVéÎþóòÍîŸ?{öß[ƒH}êóî³/žñ+ó.”t˜RÞÕ\=æÝgož=ßÿæêîáúíÅeŒA„eÿ›ÿ÷ò"”CO=í¿º˜SŽužúþæµüÑCÉsÜß]üá³ÿ! yý˜€ns–G}öêÙ>_|öGiÒ®z -.ck‡ÒËî2æC+ Ÿï¿»¹~sq™C>LÒ÷§øg:ô䃟™|Šûoo®>?ÑjÞrõÉÏ–¾;Ûì“UgWß¾¾ÿô_~ùëßýêÅ…ÎE>9Ä)öÝåõð‡!ãÌÃf6ýÔl|xÊãã¹Çÿê³gÿ.š9Ïy÷å=L(È€Ú¼K¢æ‡¼‹-χÔv!Õ~k¹{½ûýîí³ç»9âÚ.N‡"º¾ûƒhú«gUþ±í¾3“©íþ(†ù¯Ïæ˜Ó!•]εbÙ½I‰‡Xå)9jß݈¤|&m¢þÙæC¨ò§‰<’.öÞw9µx¨’~˜¥Í<‰)HÒÔSßI“é´Ÿ¤ Z=Ìl ÕÛNÚåCÖnS”EÙ‰§CÕ¿S<ˆ¦Rã¡° 1‡&#‡Q٤̇:ËHj:è@RÐVäò6‘å*Ò$ŠmÏI%2‘wyÂÄtÆ©WL-‡¹¢JòT0ì<³AÆ"§].²lÒ$²ƒ‹$ŸÌE%1BÂŒ>$|&à ‡L‰ìá$Ë’´ÑIç_&ýd›u.íÐ¥IÒT焽jM¢?¼•CÖˆkãœr×ݢÓŽË„sÁúS€%‘¯X3„pЬ!q>ä Hˤ.i:`pQÖ%P Ê'«‰Î¸Ñ%·C”•R•ÖI–R191¥rì¸Ê¿°â²qoiº©å-€¤‹êÌ`¶«“<#áé®°ÐÂGýR 2]™S+Á«†..\¶;åCÒV|+!ó¶o%ÙEY¬8WSù*Çf92EX‹¨e‡T[*:&³’éÙ†WQÿ$ [’ ‹Mz8ȤºLœ Û¦ '£‰‡YŸÝädý̽Ùúµ¹‚hyŸe¿´ßÚa–6è¿ñKQ­&‡Ò]’ÊaŠ^à£Dz–žÛèY,»sÕõO1kQ ™u‚A"P±VS€…C"–]¥MM˜ø-±ì‚65Û:t±ìÜ`ýÍ ·Ë:æBe?r Cƒd{+4 1¿ˆ5o&‰ØylT“¢»Ðñ}´{a7²­¢A¢¢¦‰h‡¸Y›­ƒJ› þkæå3Y\B´ÍW PiÜA2 ¤ç‰XqKX›N= “èXÃ’‹a5JľÅ#æÔå¿A%2ΕO欱ïc77±Ø·¬RžÄ’ Ÿ%›CðgUõ¬:™#lêžÅ]6ø H`L2‹*Åžç)« -qqä¼HÐ2ñRN ̲Ü‚¨‹g˜%ž‚ ò¬Ê62²Mæ“DÒ¡Ðâ '{ºxuA¥™ÿOYáŠc(Ô¿ ƒeµè~GL®N4Ý-^°ìâpÔ YÓC†…‹ÝdJä3uAÐ]}ü )ˆK‹ºìý·HTò$KÊt°î@q@¨ÎX6vb±ä ŠŒg²Qrø ŒP]EbƒP1{ºÑd¬XŠ*[­&-Ù¡"¹Ê3õÈ QŒ¼âðÃá(ézPÅ곈¡©‚3ÒŽ±û8¨ŠhœÎ<ʦa-pëŠFQq‰¶ä\ΦKQjÒ%­´WÙÖˆ“JDþÙ‚: 5Ô9Fqq¢.¢¡Ñ…HÒ4aÕDiÅ )èØ <ÉsôÜ inX´4Õ`‘‚jTNy¦…‡$­»¶™P@"®Ç4=gdÃç˜ÄÂᜠ$UÝt.ÙÍ,5»¸—f_U€’Kýl€’É£›LžƒÉSÕs*Á?ê¼3ÏvѬ¯ I@äD]£‹ç/–/Ït‘A~!±Mîêƒ ”šT$Á)ÔÝ‚üÀÁ)Ñ¢‹Ä!P.œ:Õ],WõiVD„ð2¹¬S¨Ì©ëvV±pœS'ÙB þ§vFu"èêŒ5„aØâYû™±oøB&û.ºæê:!©kŠ5tF2Û¤(Éð*G#îθ$”EÒäxŒê2# Dàb­.‘@D޾„}n’®Îx–O4X  %W‡ ‰Ø>ƒÿiâ#%â‚(×ìÓ œžŒïÄÈ–G5•1âê& Cb„#ÚBðBA‡’Ge[ã(ö]ÊÊÇLj³½¢ã`Úå¢!&ž \­(´¾ËIô¤‚T_"Gz Y}®N”(¡2´—“H¢ œ°lÚ$ͼ¥ã§ŠHàq<õ8…ÆHY$êpäžRt)ºŒZ›ÄÆÕs.ˆ78†j!mÄ Šs gP§Dl>´À‡7½ZÉ­ÁÎè˜àÔtI;N0•tõA5ø±µ8¨–­‘ý׃ gû'¦^¨áö¥OÏŠ e+ ›È–`-š¸%G ØýdŽ_v&X¬#â³ ¯êr©3ó­pó®L²êötd°^“{)8r`*À‹8(;ޏ—jwu:"RWpÆ0$jc“8D#e±YZoKÑ (VÓ™ãÊ‹„2t­d†Ê¡2ªŒ­ê]]”Ï⺫Po&Ûah3Beãz’J ÀëzI®²]FVôv’l÷:NY]ÓÆC¯ëXjS—‹F꜅Fž±# œ¹[ö­Ìëz©bÇ^’úã`÷ÆØ%A°<ÏÁ&Ñ% < Ç'çò‚ñÉUcÒ£ 1ªš•Hx[ož^GVéŽq(* ª2+KÏ$\M4©#óU3JÒ†XÓžyP¦ ù²Â›ZœU"&®k!žG-6!Ò‡B^¡•Hü“´fºTÒu-—á$D5s!Á£n„hˆ^3¤›Ê€@FªÉ/ 53V 9(àƒ?Qg›æ˜˜º(£ŸéK£Ê¥Y¼Í4ó˜±~ʤ٠¨Œú‘tžVòß™OGè6%¸Bà¸k.|:ò.º`Ѷ"à³$¦Eµ‚¦‰k4r º9r׿q5e In²êŠ*®8l#÷ =®Äx5÷+­j‘úˆ¤«‹.ÍTW.”MæNw‰¬¦X:®RÐxcïcyäD”ñRåO‰ïô°‚nRu$€RGÔä+“ŽEâ ˜õV¤±s—ólãUýPKfÃY5&vz¢åËm·êY…¸'±ŸÂûú<›ÏKHš!`®âô'¶Áú&ËØ(éza—p®ÐŒäü Ì]@ïtÐ{V}²È"É^Á%\¢¢I:SËHþ°Ÿ¨^^æ•x#J–Òüg𲦷äÀôÕ®|Ök@J•Wöží¤I©!='®ª2Ù"!‡¼x;Únš8!Bµ'g`ðÚ¡›òË5RÏ+«:x–¤qw7µ´³W™‡¿DY“µ74 yóèn¹4â[ Ï¢¢Ê¥,hö¢'MAÒxe‡{›8b¤—2 R´M1b*]ª*ól[UÄÊá†0k#ÊZÝ5°ˆ•óOˆ‘à uÙy ÄÆaˆÕnÚ ©ê„Õš2«„XË”­ º&/`Ï_âå©Ö°Ñu½ö,¹ðTe.8®˜Ò£(™j–™-$HéõÑnQ î»cE嬤_¨b;<®*]b‡ j¹óTI×Ó ŠD53ÂÝAO-`œ‚6²1ö(DuXPœ¢l# ‰Ó ·pöÓÄ Ä$£*%s¹N¢IDék'6‰ ö”yR  +½Èôô´B„I‰fœ²&ÑtR­h^WP塜šhP< è*ÿ%ûx?Kð°MU}2GÖ§À€„>ªÏ~iïv v1q¤/€q©=üÎðÁB|°ÍÓN⬴{£ÿ,YÜhóomróì«g@ çgñ0[Å#¯Ñy\…d9Ñ|âgoží¯€¡+\ù½K™—Pó,q‰N&ѱ€)N&ìpOÄÿ…þíh@x2ÇMqø…¦cš%"¡ø„cš Û¦‰üû1L³ «Nô˜f‘a2Qà˜¦êT|¦‰ ‰¸È9LSÏb ’cš Q1‡f˜&@žºÁ4Ûd·´s˜&Ã+Ÿ‚i]G1M1ê­5‘¤#lè fu³ f“}#ŽHLluŽiÊÅsâ‘k ¦zNà Ôl+%¨)QŽ]Òþ  f«–Þ frdg šHÈgbD53.?\cG51ôFðñ¡šðúÜC5‘”lrÕ”ÝL>ªÙä4Rá ¨¦úñFÄÒPMäÌÛª‰Ó„xdö‹Rön Ô„ÞL|¶áš¸„rxkjþ„O2X¹¸‰Ý¬‰[mÊaÍÎÒaMX¢I Ö,H¿è³ÖÄU³±Í9\SW´ÖÆ5ké§9® ‹dªõÇÆ5u¨= ×Tá¸æ`—üÇÀ5q#Ö‹ÊY\³¶jÿ[àš%UB#O5Õú9ƒ5áYÕüè°f©3¯Ï?×D\M€å¯k6ç×”Ños×lr¼4r`³O™€À#ÀfóØûo‚lâÝpG6á©ÿ2ÈfKŽ9²‰´ÇsÙÌzŒQrÙÄl6“Èæ06‘µ¤ ØÌiólâLå"°™zö'?Ø„)\4`S“µ:ÉG6ueÊM(ŽÆ™ÙÄÝœ#~ ²Y=°f ÅΆó°¦]ÔX3·áyÏÀš8 éZÖ¬ÑÑdz°&6Ÿ*óX³9Ä1`͆e hi¸&_"ÝgqMm›®«¡ל'‹œž„k"÷ÚMòýMý™ˆ6`SĉA†› !ãôT`.³_6s)T¾Ø”ó%ñ[l³ã³Àf,ž’w`³z²ñol*ù`3ŠvÆ<‡k"Ëõ3\G/‘±³¸&Îâö\öÃ99®™€ÁðÙ†kÂmrÍÏãšr¢U \s*–lÙ gÞ ›­YXñ²™2[!›¸qd³Ê¬ôUŠG͘#]ý#Èfœ£lŽlæfÇà@6ὓIQð#pÌm–H3M 3%g‘MªªÝ ›@gÊÙWdÊ@6qÊ3ùïÈæÈ dÓÀ¶Ç‘MÙÂ'†l*Ȧ¾t ›‘±ß£Èf¬FkxÙÄÖïqdc¶g²Y‘‡Û `3ãDä;°Yƒ%{ØÛ›xyÀ¦'¹×”Ck²~×$’ý\3ôy×”sÚ¶ÅqM,«=ë,® ÌQ×Å`ÍԺ咟k6Ë»>Ö ©ò¶;pMlBý¡¸¦¬±y®'àš)çæX£ášyàrgqM}·@³ËOÂ5A‚%By׬¸–éx×”ÿ3àÚqÍ8š>‹¸fFB›í¸&.ô&l†ndP65¸œ ÇT`)ÇÍ\ìŒs`Ss=óΛˆv $°)m*v`KAÅ1`S.³öÖÔlÎÆÚÈ&ô…^Ü‘Í ›$djÈ&2x¤œG6Kw0ñ,²™q»Ë#›Ø¾F6e4Õ±N"›ˆŠô’´ ›¸Å¤<ƒlŠ&Î6`G6MsÇ-'¦SúºóÈ&²e´àóÈ&’)ê†~÷¯1âõE=!$Ì,ˆ±;^_ÇX×öõT„ñ²8ž…;IÏëg™Ïú€jB0dDu]Õ›Û/ù^ò,ç¨ ß´Ìöîò‹ýÒhÕ14¤È¡ÏF—Þfóp1^qÍmžï__@S§Z÷ß¾{3ÛkÓGÏV00üØÏ&xüÞÃä0–X-ûø^\\ÈnÄiг¿ü^·—H‹É=xw)ŽB»–Uœß^Gq‚5h*r@‰¢~`*sZ†¹^ÆÓ‹ˆI.ö?ò“Ï/¢8áöÈ"®@ûÀ"EÍéøÝâ¤×xƒÿß 'h˜Ë{m†@ñ$mãIðÑf–6~—m†`isôøÕx–6ßÃ|ÅGɹ$¾ñÍÌb¢—s(rôGù#/ÌëO$|Zva†÷“S{ /¾KÛå:n3S³[õïÇêÉ´4rÁª‘Ü8e^ÕëF¡è»*K#¬᪂KÃhä‚u£Ž8kÕÆþ^5‰0‹eÿô¯õÇríY‘IÞ,‚u#¼µ!ÁÖÒÈ«F ðwX5‚u#äÁ¦µòº`Ýon´Õv ÁªÑÑ6®öu½gN• „Òß IAžF­“­ª]I6­ÀšŸÒº•I6­°²¥«V&Y·r,iiµ K«VH_Íë'ºdÝJœF$·´rɦ•Í{ÕjµO´ÑŽD2²r¸ª¢ž‡±ó´øUÜ^$žÆWp»h„ ó$W<·“>ø2àÒ4N øÆU=‘#.‘uFÙzëÿ{Æ£÷.±›ü£óƸ€È=þ#û•ûD±~ëg=—¿ò¬ç>>ºí¬ÓÓW³|Ä^·¿Ù^ŸÝ÷›õj5óàð-´½ $­µ/"clã?–VsSÈ%ÛVÅéx£U±kõªÀvóXÖÊ$›V€RY·2ɦUQÎЪQ1ÑiiNyH°÷ä¹nÕìV¹jÕ˜ç[µjžù[·ªzC]·ªvg]ûd ¿ëFl|í,—ýMO.Ù´²<Ѫ•I¶­zÝŽÝ%çÎkuê PÐt=x—l[U…Ö×­ªíëó)¬õ&ºdÛŠy€u+Ï ¬ZøÝöe’Í©3eåÚ,­\²i…äeŽëV&9wÎY«S眒qæM+J6­"‰‡«VÑ©ˆëVE¯æëVÅ.ë¿{ÏŠW­Vv­—8=Á;6oÒg.c+r@v¡P!Î$? §ùôÃuúá'Z!éÔ +4c€_ú©PäœYûÿ+Ž¡Èë“~ɳRÃîü—ª:ê—?„j}‚B½®Œ0×eZ$ö²í¨pšõ„¼ ®¤Ä:e:È·§ e:”ìiR¦—j ,…B6äº:eZnV_†”iD&G3‚ó9Æ™F­–%rÎ4 A>×8Ó|˜M(Ð 9#çL#ùÎ:P­Û“œ3ºÄqÚ4àvr]6º18œ6-/ä´i¤BæTèÝéÎF›BINªÓ¦ä'V~2Ú4¼:iêN›Ž +p—LÚtœ 1´iHÖ¥ à"áØYÓ±š¥ ,¶bMCÂi;kz%1Ö´~‹6Ö4$…u©ÈšV‰Uª2Ö4$¤Ç:kîÖ´NÁ8ÒÄa!Iä?{-¨ÉÞ(¬iH4YXÓcqœ5½’k’°fM¯EÖ´JÈ96Öô2«Q jjÆô'kZFÎuÖtÑ’ûà¬i} ƒÌecMêÖtƒŽ£MÇñƒӦ£œeC›Æ=—ö0ÊA…è5¥Œ7C6å B3tÞtŒþƒó¦c´ü¸ó¦l#1~”ƒŠÝ%Æ›ÖRYìy”ƒ*Î’6ÞtLÌ ÚtÌÁ´ÀiÓ`¤Ð`6³‘­T±²gƒ6 œ‹„°A›.ÝlN›†_´omXk‰8m:ÁXѦ‘fgu§M/üÉA›–aÎü–—ƒR@‰Ñ¦cÏ+m:v£¬9k|òòœ5¼ Ù®ƒ5 d )cM+@è¬éD¦¡S¦ÓìÔ\§L‡'›Ï(ÓÀîÊ–2"›Q *d§bgÌþœ3 À/n9Óq¦5 Î4°I3Cƒ+ãœi¥íRbœi‡dá9i©xZ¤é8žn¤id!)ÒFš†„œU'M§äEœ4 k¼iZ$Vdm¦!!-ÔIÓ í¤éUcMCÂ:m’iC›ÆÓIˆ4Ú´J¨KΜÆ,Èmtæ4$Ü gN§ho, ê4$œ…Q§u í%¡áÞ©ÓXyZS§!Ù0§ÁÐ"Ãt”„ïŽÝsj©3§ÓÂÉ6æô²ídN« ‘»ìÌéEâÌi£;;m::çÔiÓ°$“Ó¦—ñ:mZ§Än6 ¤šýmKCººÓ¦…sÚ4¶aæxŒ6Í›7´ilù¼)… )lhÓÊáä·Œ6 ÎÍÆyÓ)Ù6,¡ìŽ4xÓ 5(!oÁUÀyÓ`ÎÑ8o:çZo:o$/ÙxÓ ªnhÓØ÷´áM³¯›ŠP©Øù?ˆÓ‰d°qÚR7Äi¼IG…tâtª5,Äéj/[/Äéf¯ƒâtjvÀâtjÕ©ÔÆÖ%¡ô½º/çNƒ’MJ³Q§Aä–;u:ƒ+AR¶’x&K êô¨yãÔé<ßkP§©ò§Nƒ›6Ôé,KM#sêtæI·¢Nç`ou-Ôéhïô.ÔéñÁ¨ sØp§AU‰›šPjL»5u¡ ;6ê42ìÜ©AÎÎwê4HäÒ:u:ƒ5¾¦Nkñ8rñ¬&¢mÒ½¼&¸ì…%¡F™ÙÁœ šDUcN#@'C×™ÓJ[Ø­‰Ó¢ŽÞ4X¬ä4 BùUÇyÓDÆ7Äéì—ŸAœÆU`ÚV„ªNÃsâ4¼ ©–ÆœVZJ1.u··X,á1˜Óô sza;:s:·ÀÌiH2™ÈÆœ†„?£Nƒ‹Æò;N†ÄJ7‘: שÓx}‡´h«e¯ó â4‰ñ‚P0áÝŠ7­]çMCBº«ó¦‰ó¦—o9oztì´i ›o’°áM 8mz™£ñ¦¹ ”8oÚ«{ Þô²xΛ†„:á¼i¬¸q—É›†€FçM/ÛDÞ´ Œ%m¼iHæ ozÙmçMC#ÈduÞ4$$oz9¨Ekœ7 ŸMÚ´ ØÂXÓÙÊÏ Ò4$È:i’L‰‘¦!!AÛIÓªÔÒ4$Fµ6Ö´2Ÿu Κ†„ŽÄYÓ*ay(u—«?I›^}…´i}›8mzŒÅhÓ$—6=fí¬i](2«5½l±¦W{ë¬éÅšœ5½¨°³¦ñÒßMpÖ´fø-cMg+ÖYÓ42º §Mƒûg$iÒ¦õmǶ¡M#éE•´i/ö;hÓ £qN›Æë |ÂiÓe²àfЦ5"IÚhÓe²ÌÊB›žG?¤M#í±aMƒæÆpÖ4X·&±rP%XX2XÓJ…Û°¦ 8”k!µmÔƒ=´~Œ5 Ž-×ËYÓØYrÜ5]x·_±¦‘v!!ÚIӣ𞓦K¶:ƒ4]¬“Õ‚*Å^åŒiÄv´2gL—êï,µ Š\Ƙ.ÍË}9cœLNÒÓÍÞ%ŒiðߌkìŒièk/c3c:{-¨Éê¹/ŒéÉ«t8cZëj’×lŒihfÚ2¦ÑßnE˜F¬iäl#Lƒ&7„iÐ=­+U£3.0=ÞŒéí½‚Á˜Fö‰l»Á˜NVt0¦ñÖÒÄ6Ƙ®)s7G-(䬂ñ£É˜†éØÓ1m´Åcºf»JÆ4j"nÓ5Ûk7ƒ0dXÚ¦T“ì„iXiÚ–‚š¤Œ0 I7z4 ӵؽb¦Q˜ÞÈÏN˜.Î/6Æ´Ö®'ïÚÓe6UQÆ4ßd\èÒö§Z;YZ;Ô5p¶4$Ù$¼§CB¶¾³¥u¤¶4fcŒjcKCBê¶2ÖÑàJC@Es®tµ;ÑRj¬Ô" SZÉ$dJ;Q£%1Ô‰Ò˺:QÚÊXÒ¨WIN¯³¤k‰^‹ÊXÒÅî|ƒ%,©“¢'eK—–4¼7[IÄÙL‰³¤‹¿öàÕŸPŽüÓQýiþq–tõÞ`Iã^×Ö,é ö—±¸%]«Õ%XXÒÍ—ÊYÒ€~Yn°¤[:®þäï–tE¬¿[‘¤%º‰’4ÒÃ$ýI—L+íd$éêo;Iºv«`?HÒ¨¬`È <Ô©"’ëP"E¢Uå•âˆCyÅ_»P‚T¢“å¡r-ñ+‡òP— ;3(5Ð ÅÊy¤8~úÅ Žäa{‰ÔŽ_uñ·’§ZB¼Í¼œ¬ Ç@òàîƒDâ úg…‹ Ƀ‚²–#yx•ް#y`1ZCò ú¬.ãHÞRKÄ‘< —Б<••Z2$†G${Ô@BÁ“Éæ:<©(1$¹ë¶Aòà ”ó"HÕÊ,?îRýÇÊièåØòë.žtPœ‹{”7RWÊËmü‹AyÙ©;̓çä‚9š·”åE@[gCópö¶ š‡tžU<"˜7ùó¹¢ö8˜‡ŠÓÌC.+s30O –20ŸÄt0' ]“ƒyÅK›.E&ÿÍQiê^¿Èм2êf`þ¦Gq0OK)­Á¼âÔ“æABëEF›Qit3ª G9šI0|ÏÊ MVßd y˜÷ÜÑ<, ÉÑ<¤U·e°¤¬kæh–Ýð=/ƒ4ÍGh^v*Ö@ó°ç®̓^âghÎjšÃy¹[‚zóš#Á„óBðAçyvwÀyÕŠŠ.p^uíp^ 擜WÜМWìòÎ+Vófór5,qÀy0eBuç 7¸ÀyîN8/xE%Çó¼bÈ‚ç-@¡ãyÑýýÀó‚W§xŽ;‚uŽçÍV‰pàysñpq<Y‚sèMv›Z½ñëèMÑk#9 7Íþû-†èÁ±b‘Cztù%CôÃÞ¢‡,‰Õ2DˆÇÄŠE†èº.è¥f¥‡F!¤– ßq<?šDðËñ<$hX«Äñ<¸ØÎŽ ÏoÓùÀ5àÍ+!IÐNÜÍ0>pH7?ð‚$JÙ@|ØÂH‰A|`•Z­$ƒøÆ­j©ƒ„¬Á:ƒø4³ø  ö+0ñáG¼Ó!>pQËâõŠî’:T.ƒø QÔs‡ø@Wå ãólê eäPÖup+µŸ|1Œoä;—_xñ»ìù©œ¶u<;<@>d˜ˆ¬:Êýf©¿Q)Yýo¾jðŽßóþRìØôba ß}í—µŒ¬†~îC– 5ŒäŒ>(~IvJvü·ÿŠ ½–ž^â  dÿ_4|ÿ70Ÿ<Öå]ž2æUa”ómVµ]ÞëüîÉÅ^pÙ“ÝáÅ9ÿ—_¿yïíM/`´y{s:Y0©©IìzÝòÓ“¯ù‹U´´‚>7—2¹©…ýíÞ˜em÷_® ­g°©µ;Ù=r sò6a¼jú¡ª8 keñ1ë_ Âñ'¾ØòTXç××o/ðv—xÃý×ß/^Fq^_¼ƒû¶•ÿUÒ‹ýÍwoß¾~q±»¼ÜQt¦TÑ鉑—›Ä Wã‘C/‰¡p†ò/×_~}LVÆ9õýÝë‹KÜÿ§÷áç—IßTÛÿÒ¤SÞÿäÿ`­'ü°Ln²Ü—²Ò·o–ÏejKw?uyÚß~Ëxò|ê¡ø«Í­´1CŒhì#ºyz†ø¡‹"Ó2ÍýüQ;x¦;%ÒfÕî¿Z ÿöE^{ˆûo6“ÿÒ'öëöºÄˆAÒvæû/¯oßÚ"źÿæè;K»õ&½ß3äóþáBöå¶H„ûÏWí®î¯_ZSÙÃ7›Î¶S»D–dNuÿj%¾ÿ¾$gÙÿĬL¬eµx‚Kwz­µÔÔжk LH®üÖì§hr©/!Ét‰Lšœ´ð+®lBb]Ær‰w÷z<÷t”lH^xdUüìÄÓsw'òSëµÏûûo®^ê¶æZö_áàc#åŒícSh ×wþuYòw«Åz¸~susýUhûïØÙ4Q—ï:ª.èÆ‹_ÛߣgñuÿNv@âÖÜÒV^nöÌúó{¸µ{{O7–/,ƒ-G:xsõpýg*t*ø’vœðîöîþpq ì:ðÏ·œ.öm¿~꺚&YÄ?sæ¸tö÷²47º…—øM²6un{æŽ|`hAK”„í>èØô3¸¢K¤_ÅÛo7îúÞ>è‹óá·Õ—ዞ‡„N: ê»õÆ^oö@&òõÚ²XÛ%*ÞN¾¢Évcš+W£µJ¥—‚šû µVŒÉþifÁœ©Õæ¡Ê›–bÒ×F½Au–¸x·nøs;N·ö¢åkåöƧ~sõò«ë·¯ÿþÕíן߼>¼~wª{½ £àß§˜0\Eã’3“Pn6¸c¥Ë1±ªAgÓ‹«v a°Jv<÷£áŠâŠª¬;û/§Ç¸ž˜u¶]qÔÖÈÁšüüT/ÈJàyÖËé1!-áEÿÓ™^P÷¨ÔÑv‘´õ×È !m}bX¹Šm–è`þU‘#º×Ö¸}Ÿù5¼¡Nµ#†{{Ê¡Ðn^ñ+=vÑE¸±0‹¯ûZÝX 1ìïÌþËÑïõ‹Û¨áÕy#{ð±‰Ø|rw{Kg#OÛ8›U#ûòœ¶_¾¹½÷~«ºÐ“¦©W££:“ñhÑk_¶øÓSê¦y\òs³»ø=·:÷­O§ ¼–¹†µ?‡…ÓÅi£xê%²apIn–[=Ñ_%6ö˜w¸Œš“‰»KàT²)|Ð@¡Äž"Î4à«S•“åhsA¯è­nåÖ~Ʊ€Núw“ÚþÝͺýÕ×÷›ïÎO‹8iû_ÃÆÏzúiˆ¹®þ·ö-\šœÚÑìµú¡½€}p+´y9±Ytz+¶ë ŽÕêNsuïsIû«wïîn¹Ü²fßrö¡”0–ŠüF äf-øÎÖFÔúöÝÃQÛ_o±¥¯nÿ«˜@ÀÒÕý?iC ¾b>¥4—Am7Åh¿¼vM%î¯Ö†ü¥û/V~æ÷œ¯0Ô3wÝð~'˜‘<—›<~F¼°^ >îZw¦?$:Z]÷÷\£¼GÑ. 'øæzÁƒî.ñDø€·§˜×]!†I û¤a¥}ÖŽâÁõBb_O*¿Öú.Pþ,Á¹j?ê/­´?9¢(ó+»UÃç ²dǯîn×ã9ãèmˆ›nAùœ›»ÓéûŸÞr±ö&õÔø7½</x™æ¼ÿ=ö£÷I#oUÓöë-¸»}Ç0/I|«Gˆ¶‚ƒ»µO}»3·oÖlöéõʪOmØ%~o¤æ²» øÝŠÀ:ˆ_œšrѨǺ×VÞv‡Jô¡×ÇŽ3õ~SXUM¶oíÁ±Ù¬î€SÖìJ‡ÒäœkpYÇ2G›|ÈúËuËùTˆUQ]xÜ)ÿîäéÊÊn'",DÏPyêñUˆ5Ÿ ±lu6ÔË“kmš{>÷)*¢Åë >?^ÁK%‡µ ›5ŠŽo&¯uBF${r%ד¾ |¾}G‡^p;}8õ„ ÿl-/ÞÜÈsùh•¥ùPGÏ÷¿¸¸l—É™uÑ+Þþ/N9àm¨mþÑNá§,¾…aØ‹}á8/QugrK3‡÷¹F“)Ì8ÄP© äþ‰{vظ´Í²cÍ%y³‰z7·QO²„Ì0:k}{gÿ–ài}h¾ïK)¹és=•"oªx°¡)’7¯¿}÷bå¶]/ÏÑÐ9æ Y’{ð5¨ç×`ó¾V³Èk9/kŸ~ŽŸÎ-|à;Äß™boSÞqgnò¼È׎$›FÛíÔ¼-H{k”„i%ñ¼ûãD›%oﲈ§¶¯á]ƒagókøÄ)Œ½£ÙItwÒ¼ÔDÿ6÷ÃÓf#Nµzçÿà F|ÆÁèícþÏgoGŠIô´ø˜Í,}NÛͼZ[Ì{ÑÇQq>„9¬-äd1¢æÏÜ·Kl†}w:ò¯°Œol<Þ8| 7³G àÚæ˜=°èxtù™]µ==üìä /gý‰6d~¥b~<ÚX¹ü³ÑÆÜ>tp¬Öñ8بê(è§ÖžÎO6üü¼mÛ§+·bhÞ/·¸ñò(šÜ+ø}ŠÍÄÔp’P¾â§8J©½^µ=òOš ~; Lõ±ÿè=ä¿™Ï<¥ò(ÑýƒýÕ¯k`õ:*ˆNO§“) æÞóá1ß1ÇúŽü}ÇQ(…{pž·öób•[ië }úí Q¯9Ïéc”g£™8ÂÞóWœæS/=Z4fT‡/d߇îÍï–ûýÙp/HŒÄй€SN—úaõ{4âütoîÙ€Õ$"ôtŸ[ëi¥‰Ç>7Lq›o?åœgP‘K‘»QÉ~ y±¯G!(–\O§gˆ*5!ßs6%+Ÿ]o‚B¤ ä‹r!·L »ÛÂo5šÉ=+¨¢BD_¬#@G!ë‚1–‰sb,sŒydÅkŒS_ƒÁÞ¶†‹L„®Ø÷ZÇ”×c-ÃþþÚîæ Oo6Ë"g'*â>õà½õ£FW÷cÍÒ6£½ ¼z}÷ó‹K9JöÿöÖ¾Ëñ½¶@1‡õâ*Tð°.Ç:…ý°ÞÖ«í@Ãm¼‡.ÛùjIËs¯p´eåOņ(%±˜Ú™;zÕãîñ;zÍùc.é§p^Ò£À¬?ã±ÆAà Ô(y›+—•þ|£÷üþÅö£õÂ^!o­KÛòºøRº¿Ñ•¶‡{À› #0ýöáúî/®4$o¶yÓˆb“ǾzýŽ­²l˜üõöaÛtâxÏíà•¡2ܵ2ô·òÒû,(Å1ÄòHîêXÙ® Ôx)«-–óåíÝõæü柋žõ:my7¹6mtòæ,Þ››&ÇQ¾0÷½;°(ê¬Ëµnsý`r9~roi»œŽð¡s ÔýO—o¾5DéçyÿÇ÷ÖÆ®¹úä¨îiA¶¯"¿Uþ,£/ OS§¹ùàþ~å‚a¡=å€îÆ‚ßÏ…ŽpC¯ûº/­ì¹]>+×­ò\qºês9ÕAmÀ›í¹û-ß>ÑiÝ>¼ºëØ}è{ÒíîCó„ã>€¤oƒ‹£ø\ØÂ¨ÿpâ„õq´xÈnz¾"éKü¡F-¤!—¿®ôýá²¢/°šà±ßtÚ>Ñ‘¼á/¢ÀÄÔ`ãý»BÑŒ§æŽçyÉB¢~¿lÒiÔï+¥ÓKù"}îFpwÝxb˜tb6éL¢e‹’¬½Ž:îS}„êòve‹ãi…zš¨Ÿ'NqUÂ÷·GÖÆçÅ£ƒÂäS8íúË/ßO¹ƒJÃ÷c"=õ/ÈŒ Ztï£G¡–fåÁg²PÜ´÷€pt7%ª~Óf)ýù¿DFÒÕÍù€1‚"u{2Ø¿œQCcÚžõo‚õ8éÕx9Ûr¹Î]ünÍÔëð¨Z/b> _0è¿\º:J^œ¹Û×V¯>ï_®V ×£I¸â(%oÎ>b‰ÕO`xß;Í'ïBg—wŽl~YþùéÏÏùk9Ê?:ºg\ß°¼áaxYYä ¿óïÏþ?äKR endstream endobj 222 0 obj << /Filter /FlateDecode /Length 3692 >> stream xœÍ[[oÇö³žÚç ›È2òNç~I¢n ŒqÔ'1(‰’7¡H™¤l%EûÛ{ÎÌìî 9KJ¶á~ð.w.çúËŒ^Ž(a#Šÿâÿç×Gttuôòˆù_Gñ¿óëÑßOþöœ+ø…8êØèôò(La#ËFFâ„^Uz|ú3Œ5<+aÚÂðÓ‹£³êɘÃxËEu>®)¡Ê ªlþr;Ægi¹sÕjº™¥ß濎k!8,¡«¯–×7ÉÐ0M9imµiÉÛÕøÇÓo0‘3Á±²£l¾¼×LÊ,¯&‹s˜KçpMx˜P= Ìn­éÛ%#å–Ym«»ÿ&µsÖ//ŸMôhU?· ˆl3A„‘œi '_O£5m)þ¹D10,(R¨&ãɸ¨DK˜³½×댷­×‹¨#!«ŸPßT¸Êë 6£ œ^7Â0ꢌ4ך›À¤‘éÎÆÃM»ñó¨ñ0÷2y^Eí5ªÎž{K`G¿L¯v©` %I„Ôש¹ÑÄØQ Z­Ãr‚ŒkE)*Mñv3Ý4Ëði$qNUËËøŒv»¼›:žÝ#aºº™TÙ»—~Ø>÷·šQN„U£šƒÎ Q­ÔÔ¢šw®ÒkXp’W›eÑèÃI–x»Î¼­µYØÁ²Þhs3”Ž'Ln‡[¥vx|ŽA wÒ>ñ耞•t@)‰rFlù ØòAÅZ[û ælG mC#9ÔX,P5ΦK)–ŒÓglg¨i .[§kµ>”+Ñm¹í¤Ý¬Q?@ U;!˜©Û ?ˆ™j}›šû«æÕXI„RVMç~Tæ).’ßÏS‰ö 8)‚½¢Å€1)R)jà‹sB+^­q1g¥•Î#¥Z‚åõs›õfÕü´CXxöûw¯%­™5Ä€3"4ÐÛm°Öê!`½m(ÚVO úGì•VÂÞ :G½ÛWÏJf;)Caõd ¸KaSI¸ä®õ–»ÅzoéýEôº3°'xµl#œ ù%¶tÒq¿!à ¿>=ú€¬õ5ý1˱|¤-¢­]C ;€UÚ_æG? ¦ÙžmfK¢m €Kûô€d |ÃînË[õLÒÀ>B9ŽÞÊ ×ŽÉa¹Yb°7nAÄ8ð¤!ðwòŒã‚öag'7¨9GþTu\„Da£[­YãöY¿%`Ú¦5Ä«ò怬Í0Þ=€#.úüâ±Oª×»‰B®UúVÒ@í ^#.sB¾;if úÌ{,@ ¶#eÁö»h7`HÆi>® ˺!%#÷Db#¿Õ ~oBöf~/ê<Ò¦#[K)(ƒµ¦ýyɘ$šV›N§6¬TKÌEµO¢(ú§A4²PC4!+äFV/Ƶ„Éé*µÂé:üL©†„¥‡â?ó+ ˆÓ"Ç•i%ºMâϪ?·«)iÔÖQi%dyðÌ5Õô")B¶)dÝ€;ÊdGYŽ hÑÂ[ \ Â.)m ,K!–YF>]m§ ž¦ó_KçÌâØ2w‘g75wÅ@5²™“Ï:ú4¾TÔÆl)ËÍe@Ð šÍ_0ƒ\`‘LÇr™;€—?«eš‘ͳu¯Ã Ì8BHƒb¹À2˼ŠÃAæÓÕÕ!\à#¢‹w%ËÛJ>Y·©· R³{àhšÆ©¿/Ò„ÿ¬Z†¶†qÕ«1·( ±E߇ å8ºzÝéL@‚Ž“$XYªïÜVMæwÓ9èÖz ãñ>âÓºÐÓQ£Õp/G©BÂ&S#Í}ré6Ù%‹o IÈ €­† Öè×{².¦áŠhÝV¡¿OæYôôša RÙgˆÖLXßy*GëZX´žÕ*Ó¿-kˆ‹™µ•¢öV9è¶C¡ûA êƒ)ܧ!¶êÛ»æ`ûtmb%–Kî3.l1°Šµu•At<)‹ [ÒíÛÇí—§[<8ד¨Å]‹{ §ïZ<@iHÌÇ!æùŽļ¼ý×~0yƒnyÛ‚N¶fy_Ä*CŒP°ºiløÐÐfoXB)ÈyTº^p5!¤†¬'2Ý”1;¶VåIæPsü0¨±½¸Ó-Ø) ·#pZ¾›6÷0ê4ïC¿G…ó.äQì%½-£¼¡ Ë›¬X:.6:üc+µ–yƒ´ÅºÎ Ëv˜7 ~Evè”w¸bÌOòr›ÖN–Üu¹‡‹å¥SÄàb­È\©¼d±G™dãËUÙ5ј{f"Éé¢H¢Gþ¥[¶k}æ$BÒ•VoÊ)} â»åf!MÊŒº¬½\8£‰õÁêq{’£v1~°.Ö`Ji(“‡¸Æã!qaj›k]=*³-ðDŒŠVy½ˆQ ò½uk¯Ð6Ÿ7iüúµÈEKÝûk  6m†ÓÖÒf¨É¤ˆíÍï`2Èï›Vð½g!¹­A•]BÔT—$‹$‹¥P{€§BÔÆC†x®÷,ÂùÞo}¥ì?)‘ÕÓMv~½É°ý<<1ÕËÛ­V“F‚dõ‹?ÕXqð’wP^ùAŽW¾éSžÎ×-…6kNù*”R£ÁäÃz.?‹ù`¸fÆ£Ú´“U5M¹¼ N-Îõņ¡7Õ˜ðꮹžæ':UK(éÂÖ“°¤Á2fœæ¡ÕuÖ™™…Ðð§QuÜźßþÛJÛâöŽúóúóüÃz7€P'Tú¾Úà9_¿Øëf>œY»#VO˜QÕzÞ\½ üo¼à'š€t g¾¥ú2Õ1ËÖåjcWTäHœåmf18–Ó*ãËÏdࢵ0Üs!L9n "kk‚Ç%\4D mø*1\dT²2Ö°€#ö#!B0[â±… ù ms=f•„¡…3Îî+4-Dš¥mך!KKvA¼Y„އÓï¤zdÀº…|CqJ4„?_>Ò·¨ž·BÀJlëGLw»©ñFSìJ€´Ï¢Q@ÿ€ñJÒ×e>J1f£1=ÿr\+.}pøøãþùi³¸À7å›Bwôq|¬l}{þ¢ÿ´y£]±šÝám$7,¤«rÒO½ê>†É—Õuïâ$˪/úÇ;Ú®%ªÀ™’±ðôÓœƒKÚ?Q'¿ß.Î1¦¤Ûƒsÿ§Ý†g›×ýŽ»üÔý@À5éÆÄ[7ÄŠè JÅòîìîä„þØî­³]jÖ?ž°Þ?þ×/]—×N%p; .h\öªt›ÀÞ´ÿEWt2NT½YÎOØ jõÈÛ¶¼×›Õ¶Læ_4WÍf}Âhw Yo…Ì€í‰NwÏšõ¦·<{jWV~6ä\þZYÎï_{µ!Oþº †8°îÃâöºg£'@ç\;Û›.ÈH¼$aINÝÞ%9‘Z1Gw³ZðN:ÉRÍf¶*ÒÖ,6ýB–%¹EÍ¢Ù}Lùaƒ+}÷äo³õ¦¹&7«Ùùg½ d\ABÍ .u´.‹8Òëu) 6x7dƒôìì#ïG?¶Ž©g:[ŠêFÔuÝ“¸ð•gŽ>íÛÿNú¥&Yn2™Ý¬ÿýÕ€ýNçs2{y;OZˆó†ÿ‰j妪O3—ŸT<ñ½ã#û-þŒuÀ«Óçÿúº$ãm2÷3»'0'XrÜ?zèªL|C¼þ²¼K°ì³’igxÍÊ–òÆx=é>ÀK‰Ñžõ‡‡òáôPÎr(ï^AS<r¶ ä{bhÀtö@L—ì=c:d1’Z@ Æß¤C‰¥¸„Τ3õæÎìÒÑV ɬÕ÷„ô6Ï }ÈÙ!Hïôt ö€8Èa¬wãecEãeé¼1ŒíÂQfSÐJ&§Pó.ài›ÃÛ{,â9©|Ô~,*ß@¾´²PN1Nñ>'^5Uª:Óý²ïª)7ɽжîrP3ã-+†­#û› P‡š‘gÑ2T—LQ‡ŸXÚ³¸˜Í.°ÈäÚ»ÀeׯfP¿&Óµ¿‘Õ¹Î% ú³¢oà`kÖJßw5PWÆû¹)Aq+/õT¿ý<ìµCX¶)Ó¦; ¼*E5ëÿ¤íAç«!=éEæhiº¿¤ð-h‹Vá£Ê›xw>H¥H¯eg\ C4WvW–XI»NÌÓÂ¥`E¬§Ø_‹óW¯Oû»Ù[”+ÿ=8,†î†þ $Oþ!Bú[!íù¢Jg0GŒéObnðýz‚&Ñe­äöz¶:yúäÙ_wÎãSrs‚©f¾3ûaÚa-“žvøcZÎ}1[}¸s‡]ll㦚á_…øãÖ_ÉË®…TžcLÁno8À®¿Y\\ ¢]»ªYD¡ŠLüBµú¼° ö"û+¾ý ä¹j¶Zc Y‚Iqî;(øM@ynŠýB ES„á;Ùä··‹YxÇ|•¾¿_†Û8›W¯_Ìqºÿ‹üÐÿ™Ö½/VeÚi¯xmª‘£¦êA}¦òzB‚²t½Øfò ÈêÅ´Y×t2ªÌ—Ü[Üízv‘Üûþèÿvº1|endstream endobj 223 0 obj << /Filter /FlateDecode /Length 14450 >> stream xœ­}]Gv¥wûiðÛÂ@Ã6°Õ–ºœñwlX/¼Æ3FË…È1À¡(ªÇ$[nR#Žïþ½'2³*Îa5Åñ‚¤ªÓ‘·2ãÆ‰8yãÆ¿^/Çp½àŸíÿ/Þ\-ׯ®þõ* ôzûß‹7×ûäê/¿nÑ‘£-®Ÿ|{µ^®cÍÇ%—ëVÚÑR¹~òæêéáÏÞß½½¹M):X¿ø/nb=Z¶|øîf9.%µ°ØáõKÿb±–7¿zòþ3±Ì?a¶ÿ©'ß\ÚÍ“ßx‘®íh5V”¸Íþõ6•c¯…ž~~÷îýÍm‰å¸¸Ýûoñ9Í⡌ß(ǘ–¥_߆Ûa½êÏ·b=îïÝ@ ÙÅ?;ÿáío6ÃK:¤tŒ­§²„aõdìçWOþ‚Ì}{\ ÆÅ>i°ÃRrl©ô—·a½W1u÷þåÃÅ;»{ûþlȦ² 7t÷öîýñÎ/¥åOúÇÿñöòÝû»7Çï^¾øÙ~U燪Çd¹÷\cô‡Ê›“{œ=xvˆ·‘%®þøúoÎ~ûÏŸÿúöüù‡øô韢rÿôW¿Ú=Þög{‰³“ÖçØÌ¯1ÿÀ÷ÏžÞ|ûâþõW;ØágñËs;zóüáüT{©/žò1|‰—cý2ë³›ù²Wß?v™ýrÿµzXŽ­ì_»}vóìæRíÏ·ý⇇߾|vøðÅËß?;Ü~ð+¶>ÜžôúþUð?2`v½½C(_žo-âËÚ܃_ÅáÙÍ_íæÊáù¯_ß½õßúíWÂ~™›~ÿ»¯ÒvŸÜÜG¿~®›Ûsu|p›©¶aÔ}N51\X¦¯ãÞ–Çî-^¾·¿{rõËѱ'Y¾ÎµôëÐK9¶vÒ9_?¼¼þ§ë·Wù˜Sj×?zçuýïÿÞ/ìÞÁØu±1\¿Ò©Ÿ×@ì¯K¯v +`ñX#é˜ðÎpi+Ñ)DZÂHÅ—Ö½í+ÒŽ•~Ì;¦0#aYP‚ 'ÃO$;ñX©~}CÜCËäcÊ\ÆŸª)bƈËíØ#ýX`¹¤c+âU ññ##á¸tE,0-9âW· ñ窌øs#Þy5Fê1(`n¸TwQ\,1ìe\ÆŽ¹—#Ì8¼èÂ1°aG¬2âOÕIÇÚØŽb “7ÁÜÃ1oˆ?TQÄÛ !íØ#ý(€ NþPl8ùSÁpò¼úÜUÄRg$[dÄÇ-'g·”ÁعL=úDeÚqË®@"—ñÇË6ˆ>!y9f¶œÃ`úŒDt ‚˜·îT"04˜>#ùXÅrTŸËÔAõŸ h+3ÒÁ²’œQqClp}*S–Áõ©L ƒë3âÏÅ–e [ï:#yp}Fʱ$FêàúŒ´c˽d‰µ‚b Ø ú„ÔeP}F!qP}F¨Î€‰á<ÚÊŒ”cõúŠÎÃemñþ·,†¨>éƒêŒ`P˜;v6Ü–Aõ  zèËúm8èü5 ’Ÿ¾BÙóÕÙU6#þ0ÆH?iƒß§¯ÝµÞôÕ³ÁC«;fïúè!Ï_Ãèý§ò>tåÄHœž‘<8}2’G×úê*@lÖc›m°yFú`óŒŒA^c˶{dÄU`a$6C*ô IƒÍs™<Ø<—æQlž‘:Ø<ÛiG)â¢&12ˆ5!qY™é‘€žâàòŒ¸ÃypyFÊà2#^í‹wC=­@\ž‹øPéx„Øàò„@4aÌB#Z8¸<#i´”YÞŒ¬ oF\ÙEºXn£ßŸ‘Ž1“„ž ‘-»FX²"-»j­è¯ IƒÖs™ );)ƒÛ3R½ébx•x3Òr‘ãÙ¼/õÚâªa´”s™´*#yôú3âOÕÙLÑ iòu°|6ÒÁr*c+ËÏe2äÝ\ăËXB"H.HgÃ.*ßo†¼# @ÅRArBZ‰ Ÿ3CÞ`P3âÍ%s]¹\ˆlØeÂÒ3®‚€xK]Ùêb¡ŠÝŽÏE*(>CÚÑ5 –Šbø”»\CÆ:”Ý\¤eGH„†%$á‚tvxÊnþ©‚S‘ Kˆ ºÆå˜í 7!zψ+°“ ì%× ‘í¶!êæk†¦› ñ:.ØFÔžJ =GE:˜=阣΀k†ù»‹†JuÒ‡–›¨¤vÕ¨îðéé d°š®)ƒÕS‘ RS‘Á:éƒÔ`Êé>tÜTĆŒ›µ:Qí›÷ûs‘¡æèlµ`V:.å¨b].›]/D¶jƒÌØ\IÉÅBëáò¶ 3IƒË!U0¶ZŽü}ˆºšn:¤ê Ø`ñ ž€ÀüM. Ytuè9 ®sƒÿú ”Aß©Dì€ ½:¹›  è» êž¸0s]â&17¹"(FÀo30ÔÛ ”±ÖF€Ñ£¸hl´1sSìÌÜäZ ‘Q—D\DÜäB “Ñ4TÛ\ëXc¤rØjaÞ&W ».UæmJclŸ.íÁUºóÉHz¡×qeJHÄ,s2ì*€¨›\ä@@aæ¦ì˜Ä- ‰}Ôgû¨ÏþöQ?±Ñ6H<iƒÅ3²J³±#ךü…›°üÌã¾*³¹ÈªÌáŸö¡¿‰Ý2˜<#«2›~©ñœ|è_ÄnÇÒâ\ħ">ö3‘}ìÏ|»þ)²]üCT„©ì£ãz°¡Í¦uˆÏ¹DS*ûð²"ÆN1c.gÕ ƒÌ3¹›Ï®Bã"ü÷<´çü÷2è<#uðyº¨ ³k¹ê“c»XÆÏŒ’sˆÌçìJ vòà3ÜËç -»`>g×™o×Å@¢kLºy Äèìj€1…âz‚ i0z.‘y\ÎqUhs‘2èŒÔ£MãªÒfDdZv°°G:W”‹‚ÆžNQ(]ðèœ]D±\„Ô@L,WauNM:üñ¾¡2bBëìÚ€i ÄØr^…یġJg$ ³³«ƒ$–E¼01\Y™f—•áò P›Î&ƒtvy ¼v1°E„Û®„Û.˜ÛE\vÅnUn;"Ü.¢á²«„ÂÕé2!³a— ‘ »LàшÐÛuBcË.X¨fW ™« Ja¾¿ª2ˆ‰Ý6”êŒte8´M…\n*䲋Öª@„ãÐ ó ·¬¿ë¡¸ †(v›rÜá¸ÿD‹ôS¦wÅ@£6ÞCF®,W Âp¼.ç;vÅ ï*é²Ka¸KaxWQÄøÉ{W†»j†»jaÀeCbËþ‰Çn Bñuyœ<8>#e|Fª²Üš .„äŽÉ]80É‹+äeYõÝŒD¡yqéÀMˆ1™åÅÅC»UX^\=D±ërHc»&/.˜ãÅÅs¼@=0„ä@x$(®º.BòÁ€J¼âú!H’áfR¢j¼Uã×Lóâ*"òc¹hXª"],ʋˈ"–Û˜–ÎH¢×‹)ÂÃAI*õŠ ‰Ê–]H0Ñ ¢ÐfAURž11\ÆütFêXoœ•{ÅuDË&ÛCf²w×I W!{MD..†ûQ•~=ªôë1ˆÆí1 Ù0Ù{LBö³½Ç"³YìæõÍ›ˆ‰å.dï®(Xäö´Ù{ BöÉ„å_OItnOYÈÞS‘q¡'•=©üë©‹ÐÒŲ Ù{^„ì=!{wIÁB·ç$dÒÅr²w×E,Wº=7%{îJvG„ìY`/‹Ý^‚’½Dz@¸^²]lšç)m/U¹YÁ@W®»†X‚"Âõº(ס*ˆ2.ôšDèöš•ë5+ס*Pý×k¡Ûk—ÅlôçUN ÂuWÂõDèöe>Û[R®·¬\oª{+,t{«JõÖ”ê­+Õ›JÀÞùª<ïAyÞUÿõž”ç]Âá{/²ð„ßeô®ú¯»¢š#Y?S7¥¹-Js[”æ&°[Û-)Ë-+ËM 1³ÆÆ)~^‘¦$·®$7Õ† °Îµ%Èú¦-!oØ­)†3“ÜâA W!9.†UýÙ¢êÏ “· aò4Lŧ!SÏò,$‘¹²°ÜB–[¨Âr ],7‘¹úQ.2!¹a³&—ÁfMS„U®E –·˜„äUúYTég±ŠÈµ¨_e,°¨ºÏ¢ É-iȼ% ™·¤!ó@˜ä–’Üß++!¹¥*$7äw(Št±ÜEàZÒÀyË‹°Ü²*?˪ü€°Âµœd:k9Ëh`Y•Ÿåª4G~„æYè-›Ò¼¨ð³¢ÂÏŠ†Ð[Ñz Âó¢ÂÏJQž—ª¬uy“aÍ”ëØ½É–±“-÷ \w5!\ï*ü¬«ðÂÂÏzQ®w ª·®ÊÏzW®wS®wS®Û"KœfªüÌ¢rÝ’rݲ¼É"dGö±\•ì¦ÒÏLƒë͌ɗe‘¯,ýé爄Ö;"¡õްôs 0ÑÒŰDÖGì§'¢;Ò‰è=.A”ß@Œ¯ XïH<òÝ ÷ƒåçHá™ì@LìT"Ò–U® Òω­K\xÙc Æ–c`¦;™éŽ$žÉ:’™éŽfº#²Ar ]ì4žÉ:"áõŽ3=.IÄŸ#"þbl9Em+IÔŸ#¢þ)ÌtG$À~ &–3ÝÙ)éˆikÉaïˆDØÄØrfùç€È?G$ÄÞ‘-Ä~Ÿ]8R•è¹ÉW%zî<“uÄ´¥‘Ž!:ò?$EŒ+«$~™áHV¢CO0 êω¯ˆ½t%zõ—*êω¯w$*ÓkT¦×¤L¯Y™^y÷¤•×7iJôÚ”èÈ!†yûd\šlŸt$(ϱ” 7‘"YiÞŠŽM´Ÿ#MiÞ8¾~ÂòfÊò¾(Ë{P–wÙBéˆl¡ˆ°¼ge92BˆeÙEéHS–÷®,ÇÆP±lÂr“{G‚²Ÿ¸ šˆ?G¤€„×GdŸlüLV•åÖ”åÖ…å&)×l¸dÙ'™åÈ>É,GúI~’$nDúÉ1±\hstDöÉ"†%º>"ûdb@vS„IŽt”Lr$Ÿ¬l8D&9rO2É‘{2TELÌȎʈä“Ht}DîÉ$†Uô!÷äÒᇊ^‘{’IŽÜ“I K|}DòÉÅ¡wÉ'›XnÂr$ŸÌüXQvTFdŸd–a–#%È>ÉÙ'³X–•Ù'y<bbYbì#²OV±,1öÙ'™æÈ>É4GöI–¸@:×X– ûˆì“E,ga:²OF±,û*"TϪü}’•²O²ÆEöI¡z Jõ¢Êù([.i‘}R¸^Šp½¨ð"\/²³2"ùdå +&\GV 6Œí¢l¸ÊÎÊ×k®WÕ}H>™äÇ%Ò>"ù¤p½ÊÖʈì“M,›’½I¨}DöI!{‹Jö•ì-)Ù‘a‚+¬%{«Jv$™ˆŠÙ‘dB,›’½/Jö®âi)…ì]bí"dïYÇ….›+#’S Ù»ÛG$§²÷®dï¦d·EÉŽ\\c•ì–”ìÈ5!–Uÿ!9eËUÉnMÉn¢ÿ×M¢í#’SÒºGDrJžÛ ;eb@6XF$§\¢"] K°}DvÊ€ª?$§d™‹ä”KV„¹Žì”¨úCrJ–¹HNÉ\GrJZâsé*›X–Pûˆä”<™ErÊ(–eå@˜ëHWÙHûˆÜ”Lu䦌󫲈ܔ<*DnµÈUÙŬDÚGd¦Ìr3²¹2"5%?@’Hûtþñ¤ò™)™æHMÉ2©)£ü–„Ú¤‹å*4GvÊ"–%Ö>";¥TXV„Íd µÈNÉ,GvÊ,†U"=ePÀÄpU–ç¦,Ï]YžMXŽä\]EvXDXŽ]£lÉ'ÈøDHQ–—ª,/ªþ ’ÕT±lJó*[,#2T ÍkPšW‰³ÈP)4¯Yi^‹Ò¼V¥9Pp…Õ&4¯]iŽ£l;G§]Ô9*YåFé§ZÔfÒTø!G¥°¼I˜}D–J1Ót0hMYÞº²¼I˜}D¦JayÊò•å=*Ë‘‚+«gey/ÊräŸË*ý€˜XîJónÚNL¥RV ÍMâìÂóYd±ìb9+ϱyT,K }DâJ!ºu%ºu%º©ôCîJ¹H^ÉLGòJf:²W2Ót±,¡ö ,¹µ …¥˜Q凖KUÄİl³ŒÈdÉÙf‘Ê2J ´ˆ‰a´ÈfYŰê>ä³LbXí1ù*DGFK&:RZ²¼ENKn'Hj)–£Ê> ],‘·HlYIJDÚG¤¶ŒbYuÖ·ÈnÉLGzKf:ò[òˆ€ü–,üà2$EL,K¨}DŠË*–eeD’KV¸ÈrÉë›@˜éÈ{ÉLG–Kf:²\²ÄEšKžÎ"ÏeËE˜„Å2]6±Ü”éY‚í#r]òEEÅ“2A‰^¢½$!zÉJtd¡Š˜\U•è¥ Ñ‘†B ›h\$½¢×E‰9Á€J?d½,b8+Ñ«ì²k?d®W ´È|)\¯¦\o‹r½åº#R$*Õ[Rª·¬To*þó#@˜Þš2ÂG «öC L6Óƒ½ºJ?¤À¢w³H)<ïUyÞ«ò¼‹òCL–¸H‚)4·EinAi.43‰±H)·¬7•~È‚)Iˆý@x½I0ù=’`2Ç‘33 VI0™ã@L®’ –™0‹Ø‘ûˆL˜I,K„ý@x<@rÌ&–%Â>"&³¹0™åH†É,Â,G~Lf9òaòƒÙa‘3‰á&$G>Ì%*"E$¾>"#&·¤ÄäÑ)1™äHŠù`bXe’b1,;,#²bЉ¯ˆ‰aÙ`‘“Iެ˜¼´‰¬˜ÌrdÅd–1±,ºI1«–ûˆ¤˜ÒP’꾜ĈD×GdÄä±1y,@FLf92bò½d ®ˆ‰aÙ`‘SXžUö!'&¯j")¦Ð<›ÒûFÙrQÙ‡¤˜B󒔿Ee¡yQÙ‡´˜BóÂ;,#Òb&1lÊrìeÃUì#ÒbòsÖ¨,¯IY^Uô!+æÒ™SH^Uò!+¦¼J|}DZÌ EÈ“)$oQIÞd{eD^Lšl¯ˆ°ÛFŲØGäÅ–7S–w}@Xô!W&Ïb‘ShÞ“Ò¼«êCfL¡y—ûHKéªúS˜ÞM™nÛöÊÓZ12cò Buÿ$TǶQ±,1ö™1…êV•ꦺ¹2Y÷!5fËf‘31 º3¹2y*‹Ì˜¼¶‰Ô˜RD¶WF¤Æ bX¶W¤‹aÞ^‘“™ŽÜ˜ÌtäÆä‰,rc2Óð €ä˜,ý“¹Žä˜Y,K}DvÌÅ1±,Û+#²còDÙ1™ìÈŽÉdGvL&;&;òeòDÙ1«X–(ûˆì˜I,«øCvÌ%)ÒŲŠ?dÇdñ‡ì˜LvdÇä©,²cò'.–e{eDzÌ"–%Î>"=fËg?Ë*ÿ“'³ÈÉdG~L&;òc2Ù˜X–@ûˆü˜ÒZ²ì¯ŒÈ)fTÿ!AæáõMdȲ— d_ð$DÂì#Rd ÙKV²—"d/*ÿ#3‹á®d/¦d/ª‘6SÈ^%Ê>"I¦4•*û+#’d Ù‘ŒB,óþʈ$™U 7åzíÊõª °´E¾ÒY%2…çMÕ2d&±*1öÈ)4oc ™BóÖ”æM¶WF¤ÈäÕM¤ÈšwUHš)4ﲿ2"KfËe,™BóÎû+#òf6Aøð¡ˆ$™Bò®òY2ƒ,r‘6S8nQ9nI9nY8n²½2"IæŽcÓ¨îÂq“Ý•I2™ãH’É I2Yü!IfË`$™< IæRébYì‘$³Še °G’L&9’d2ɰÌEÚLþ© öH’™Åp’#IfÃúUFs¤ÈdᇙÌr¤Èd‰‹™‘Ù_9~H‘YŰØ#G&³92£X–ý•ébYöWFäÈd–#G&³92™åȑɣ–¸ÈšÙIJFØ#G&K?äÈŒbYCìðª²fò; äÈd¢#G&92Yä"G&392™é@ºXV釙,r‘#S¨ž5È92…êY¥rd²ÈEŽL¡zÑ({äȪ—¤T/e¬™¼ô4™r‘*?dɦ9ªh Âô"AöÈ’)L¯*ü%“%.²d µ¥TU}È‘)L¯d™Âô*Û+#’d Õ«)Õ‘€‚ªÉöʈ$™Bu$ `ËH@Q1±\”êMÃì‘$SJSá‡$™!)"Tïg$™2&ô¨Tïh$™Bõ®öH›)TïU©Ž,\c]¶WF$ɪ# EPD¨nrxQD’L¡ºi¨=’dÊEªþ€˜”ÑH{äÈ”qÁd‡%rd2Ñ‘#“g³@˜èÈšÉDGšÌÊ€î°D–L¹È’ÉDbb¸2Ñ‘%³Šáõì¢óB²d2Ñ‘%“[ VÈ›É\G–L¹È’YIJn°D–Ì –uƒ%Ëf,™E,ëËUÿ!MæGSY2™êÈ’YİÊ?¤É3eDZJTõ‡,™U K”=²dòTY2CQ„‰Ž¼™Lt¤É䯔4ÊY2“ÖÝ•-‰ ±GŠÌ&f5Ä)2™äH‘Ée°"­$ëîJdÈd’#E¦Ñ{dÈ A“«tw%’dr³)rxQDŽL!yÑøz &vTú!IfË_$™Âò¢Òˆ°¼h|=’dòsVÝ]‰™Bòª»+‘#siŠH®GŽLá8öŒÊUŽTŽÈ‘É5Q5¸)2y0@ŠL–}H‘É92ÙLÓàz Bñ¦{+‘"³ŠaÝ[‰™Âñ¦{+Ç›_‘"“§²H‘)$G ¶Œ=£l¹kx=áy×ý•H‘)ÃAW釙Q,kx=!ºéK¤È¢›Æ×#E&/m"E¦0Ýtƒ%’f ÓMÎ/ŠH‘)T7 ±GŠL¡º©ôCÒL¹H‘ÉTGŠL)¢Ê2‰éÿçê—WÿzÕqì7ÞÀ¢‘ä5WÄ8pË]òðòúŸ®ß^!,Ú¿ýx®ÿÁÿýÍÕrý÷Waßö™Æõ›uv /â+lËßÏ_×W£–YÒ¹ÈéëTé ã¶"§¯ç"#f·¶Óœ¾NEæ››ïõ\d¹~å•áu¶ÿ½xsý·O®þòëàó¼AΓo½F™ë0²Kx­#dÞkíÉ›«§‡PonÆÕP¡Ïˆ=ÄåŒÇ8}Î7¿zòW÷ÄNþæ„”¶æïUòQ)$´)ÔŸœKd}èm*µ#T Þi.´Tf„6—Y*³ÝçThºóϬ_Ôí-*™ð#:ÿñ^º®¼¼übñºÌÈ®ÑË!¾¼ ùü5¯×(?²;:i‚˜Ýí/…~ÛøX¬bÌH‹|E^_}wNü{Ú‹{§ATä‡åOsøpóä7ççÅæ7ç’biÖÖçýpýÅõË„Êú {øðý³Ãí‡g7׷ׯï_ÿöò›rB‹ãoþ§g7ççÿå¸ÇOÖÁ`øSÜ Ä´÷W¿òÏß<Âyú¢ŸØØ¸}-H@•Ë©KIi[ŽøÄ/^´Ÿ äHA2;×èo®2¶YûH¾#¯lï™ö¹KÆê1;‘¥®!C3‚¡ÊH\س4ÞþP™ëCȈì!d$Êœ‘5p‡ñ’†‘öœõÌùvpæ ?Ä^3#èÊ##ÛË“³Ê#[âÉ A ™/=f¤Žâ„l/4Îfp† ×Ϋ2iëôfBLÞ¶¼Žç2-ªÓšÊÏжwÒÔém¼ ˜œG ¬ì:T&ùÇûÈ™ME¶$‰SSŸ#Ò“kÇ¢ø|¼ "[DÂTfK^8![®š‚}¡ìsì `K:8!u+OHöaûf!F`·fb`{¹¾(Œ<€Tf¼¸'¤‰Ï±¥’ɇ”©0²­ºž¯Bbd¤®ŠsB¶ãë'ÄV5yF?È–Óö|B²8{™}Ø‘IJ û°Ý°pýà…;ÿzÞN…ŸºÎÂ&¤ã½Ù1ñ:Ž{âê)[R¶ ÉêõR…~ؼÇEê"ìþ»¿Rb$ÿ°³‹Ž}\ÜçbÛÖ"–»ð[²[Qú\ì·jl9îs±—*ˆá.ôÃV)v:6F1ý°1Šï&^ÍP:A wñv/qŸ‹½JÜçb¯’±åTÄëØuÄôî#¦v±×±HŠ$ét±5¨²áÜ„~Ø$N/ëfü ˆêó’…}د#>/MQL؇­7Üçb§ ÷¹ØWÃ}.vÑt¶\›Ð;dÄémþaû‹x½eá6»ˆ×[SO4ã(ÌŒ}+\¤Gés±EœŽ þ©Þ”~ÝÄé”}Õé–•}¶íÖž&}.6yd²Œ=ìuìà`úa¿{»3ØØ‹Ñ0q:¶Y0ý°©‚û\l¡`úaÇ„iâsì†`öaïû{˜}ØØÀ>ÇÄ…}Žm &–Mú\ìHà>;ØéØmÀOŽ$ø§R§cëÓØéØÀôÃ.îróÏUš»t¹çŸ—mŸÅ„$õ9‚è¸v3ÇQº:¯°ù!jP§#Ö¢fés/^¯ÛÆ… 1õz B?ĵK‘¬NG€?DëÒç"øœé‡às¾‚‚Ÿ¡o›&¤ªÓ{WöÙ¢N· 쳤ì³"].»»îÒå"h;2ÄçÈ.‘"ìCüuÃ]؇PjöyÙOÛ™$].‚¢¹ËEP´‰å.>Gxsbˈ@ Œ$q:•™~K^Ärú!䘽^ösi&$­ï&¤ˆ×Ë~ÂÌ„tö:¢€ F ?DNÒç–ý˜ iâõý„—3Rõz‰êõ¢‹<²¯o±L@W§×-Ùö„DérkR¦0ûæ*>¯&ì+ûÉ'Õçû©&RÔçû‘%bêóýD’ ‰Òç"nT|Þ‹òo?JdB¶à†3²2!Q¾Ÿ2!E½¾ð1!&}.B3Ùë#ì²0’Rd‹˜&ôC´d¢ê©û‰Ùëu?-cBªxa̾ÄȆ÷c.&DyŽÈNGða2Mœ^÷ó(ÎÈvúÄDñ9"™}u?GbB¶7ÛbÂ>Dö±Ïë~þÄdñùˆÑã‡ÈMúܺÜpFJþÕýP† Ù^OHþ09Lè7Bà¸LMB?D¸‰Ókúè5±lâô¤Ë­ûé²½Q*ìe ˜±bâôž”|=«Ó{UòuYã©û9gÄ‚t¹#X‹¯²¢ä³*ä³..GL“oÄT%F’áQL>|bŸ#ŠÙ7bŸ"#A؇¸&ö9¢˜ä¢*ìJ\&.Òã"úˆ{\ı™X„|#Ž(0Ò…|bŸ ~†”Äç#Þ‡=5éqÎÃ=îÞaË9ŠÓGd[F?EnêuÙðS”E½Ž~Š"k<ާ—&]î|aßÔm¯ü„DqzÕ%ž±ÂÏP›:ñ(ü M—xF¬ [Fh ?D+êõ¶í<Ÿ®^ï²Æ3â?Ø0¢=¤LQú!’ƒk!  Hƒ+!lض}ÜRÔç®àg0ŸÀ‰ÊHú¨ˆÆH‘.g‚r—‹@#[Fld`$®Q—’…8Í“½Ž“:™8˜“½Žc8™8t“;]±É.Ô\Ø2" Ð5œŒÉ^Ç9˜ìuœzÉô×ÜéâŒË.–u‘§U2ÿpZegË®(Øí8w’ë"7õz6ádþáIîtq:$›Á‰ \•æN¯Aè‡c™~8²Qœ^«ðç1ŠÓ«©'ZN'+r§‹s¹Óű‰âõÖ…€8$‘ ˆ3Åë=)Æ–{Uâ|±lJ@Äq±eKâuÓEœ1(^·Î©T3Ndþá¸ÀÊ@úál@“2Uè‡cþ’6ñ:Žðk $q:Žç[¤L§[Ð7T8iï8étqŠwº83}nû‰6Ò…}8}Žð˜~8ÝŽ}޳ì˜~8Ë®‹å.ŽÈ‹ô¹8”Ž}nûé0R¤Ï5yîÜ…{8&N<^¢pGÀ‰ÇKîáx·E,wñø~ÔÊ„Dõø~ŒÊ„¡žíg¤LHêá@5îpq|S‡¥‰Ë÷³L&¤ILB—w]âÁ‘fâò®ï§p\™˜iÒãâl2îqqQpüÂñýÐ Ñ F./8 Œ˜W–ý´Ž Éļ‚S½¨·-8Ã+KcæÐE½mY¶#4& 3ñʲ1!‰W–ýì‹3‚œÔü ûÁ’™yeÙ­˜Æ/Ë~ ÅI ÷¶eÙ›˜Ìä+8¤Ê¤Lcò•e?$âŒìGBLHd¯œ•ù)²,ð”e?ÊaBŒûÛ‚CŸØp‘—S:e6¼¸0!ÉW–í0…3àb"òOUYà)8d©píàþ©ý̃ ‘—SÇ#‰×qz?Ä~VÁ„Tõº´d9À…Ø,ŽàúÛ˜ªäÛ˜SöíIÿ'$©П-#}?{ÉúŲq‡[Æñ>‰‘$ô {šý ©B¿°çПúáÐv:ÎØa§uØ2RÝ3 ï¦ NËaŸ#ì™]1¾á‡ˆü;± õŽ™ø§ÆÊf“,ï”°çŸy5UpÊLË]¸7NaË9¨rbî!“zÜ?,~~uÝbiOæ÷øyùûùë9f=õmkðVäôõ\d„Jk‘óש–­ê¹Èéë¹ÝÜ|¯PüüÈÀ‹JŸãçQws›ÑÂ{Å·8¾!(ßÒþ·‚oyÿ†/åö| @Þ|õæ„”>2OŒÚ»P(ÈBÍT §Íû04•Ú¹TÁуµO¥v„JáЉæRB¥Ò\jC¨ÔHGSæRB¥Úšï`*µ!Tj­œ©Ð¹¶~ߨ}L5¼]Å8"æØýq–îGì~9ÍüµŽ¯ûô“¡üiYl執þc Ïh0ÿ ã§‚ùGà™ÏNbÌ»Ôñü²¿¤sÈþõíõÛÿœ úÏ ÛÏã›S?±Õ°ýËÏï=9–¶|àœ#’‡/›gÿï»»·7èû°†d‡W7·ˆ}3 ‡oœšóôpÿÃTæ×7·xÛç#©^¿ÄØ ßO<¼D!—Ai)ýðbþr÷îîþíö39ž?ܽÿnºòÍve½öÃû»ó×/·_[úáùúÑç‡o§ËŸ¿{¿• ñðüíô—o¶ßô[xNFéËóC<?1rRìþÍü´óEÇóMwôz¿é¤7?÷ýÍ-B™Cn§;MÁ+kÌtx¿;‡~ðÝj³"åCCKü˯¹ÑõÁÇŽ[¬ÑwΟ|suøg´y/™æ’·HÚ’pÂê2 ½Ú ‘9¼ÍO­lEž.ÂÖh»™—Ì@ÙWb£ÈÓóþ† 8|µJ‡×7>p ǸÖsæ@Õøáûñ-WŸ â~¶: ÂÄ»”ðS7”[»pC?ûj³éƒ·f.®½<^ö±¯Ä'Ãp‡aÄ2´`×O~~uø››ÿ~…À0[êéû lý…þÚÿƒ8úûhégþ}XŸ÷—áSFÅ­ü{×j?»RQ§— ¢IÅ5^}S ¬Ù×Ä›kþx÷L<üÑÍ¥—ÍZj0w‹S5‹÷î~7e{Ö×kƒÂš7ÄÃ3}úGÉé¼'ûì–}ûº.<ÓHoúVê.B`ÖÙÐú,z?8Ü"íµ÷Ô[Í©j>l÷Ï?±@±ìµýÇMbCå'ôéVÌ—Ó&ë^¡>‡,–GÁpé 34zÛœ >Ö›ô^<ôË ‹èúW«± æsüÉ—ëË‚Ýú^%_ø¯@¯Ïiß\YiP\\”ÔEçöýYÍá’¼JÍ~¢Îaåb'­óÐ"×ù絋~²]äþûÞd|´aøüïц‘Òã ã4>ýì’iH$·°³æÒ“ŒÖu*25¯*½Ä‡›ÛšCÃÿ±¯Ö,z—:>ú¨tªIªƒqîo¹\2F6—ši®‚õV>’nlv2D¼(që°–µ)Ý"î¹z‹îKMëÿøÝ¤Øö†ßrMCš!r{iùp?k¿×¿ÛþàBå½\Žà辰›5áûûÿvÑ_˜.>H~ºÍ€A?Ý™`˜è˜¤Ïmæ+ܛ߇ßÜ©/áêCúsoA…‡1ˇ»7ˆö‡û‡÷®¡/Jte¶rq©rੲxÛkÊPÿpîrv«åqÍéùnwC?üæ#‘¹^ñn¿A—ÏÇ]Ã!¿]?¹nÚ]\Ú¿[¶¾;ž§5cbá#èÃã³­Rfl“ ä!Ž>‡Æ‚ÁP>Ù*pífõqsN^°uÈýµN^þ×Ý«›tü>7ùׯ²[šqíMþ7Ŷâ>=ÁoïÞý@s…»›)F³¨wпØYÙ>¢'Î:ó†+Ó®×îÓd~J®žÐ:Ð`üêqNäjÒ>îN?â3’o×r˜‡h£×gi]ÏÈÜkúöîÝfÍúá¿|óEÖ©œ³Ì›kæõûÿúåe­‡ø Û‡N—uk×ARlj6we?¢^ê㊠Ûh+¦JSɧÞ݆oe.&.örXRèû=¼Üz¹01oƒ»Æ›3h“©7¤;-›ÒE2úÚÛ(÷Ÿ. —ïÔçÇ8TÃüÝûw[»Ùû‹‡çw¯¾ýCÞyÍSæû‡oâhWÞ&×àQoÓ8Ôk#ȆµüЋyD¹`ÇÓ(qêVFc½äAHj÷÷ÞCOÊÜí÷piêµÉC<{õzyTžQ-í%ñO‡høÿd,}º°JöyþÙ~yø[(ÑE+…qÔž·üÃÝ: eLø™¼xðÍÄ”»u¡bX‡çsO‹2÷'?¸{#þåvŽDñ©Ø^B;Íô¿¸¨—19Zÿ‰Êÿ£ NªÇÒ1ðÓíDYœXýs;Ù¢jÿhIhAɼ»c­ÛSe6ïC^Íõ~©šð6>×ð©ûBŠ4¼O“Ei28³fŸ(|õÙ<~z]åôðÞ¶ŽóZÑáˆ?a…î»iUOø;{®['зj}Cº’ô¾š ­#b5 !l´óõ³MÛôë®ñšØ;yì½î뵋ä?dÀF¦6§ðdp¯OÄi÷xxt›YÇ+˜ïïæøj¯È#ìó÷çŠÒ¡wœ—»®X<÷»íoK]— ñÙÎ}3w"oNÚñ×'%Ì–ÁV«ŸX(¢õât ‹cý³§Œ-„YþGéiÚB§‚O•ΟìÍ0OÚ‘~z*²ßK|ì^,ñ­œôL{Æ.JŸÛýǵglŒLI›óî޼ʷµueW‹8z‰štnçë´àä¹1Vÿx?Æ!¤("RG‹ñ¢z´ú8hžv¾Þ¬¢u¾!í{qm}ôF·8FÖ‡Íum݇„ÙúÓ¨úâQØ]úû½2À-¹:ï9ðÐ5ó Ý=B„™Õö©î;lb°½{ ¼:ÕþÇóÖq9h’·>aÓgV ¿žKqŸñ|¼”YŸ1î ¼ö“â"ú€·w?)Êâãur‹sÜZ¢K;–¥o­qïÒ¼iÓ@õŠºàwÛK•ž·,iü¬RÉöIuÌ<{øíF™T?~¹¿£i§Ñv»âøåå¹,ާ\]iZ×ì^^ZiŠØ‰‰h‹Ø·nèÏ?àÎjK¶”Kë!8-(£ïš.Zß«±/Ýɘ0ÆßÑ ©Õ¨×òYßôÑuââ—}ùìkœýƒ§ñá ·¶~ïåð×·ç¿ñüÅwwo_þù7÷?üúõËã›çŽ/±@‹Ý·Ãþb¿.`zðìOÙÒ\Ÿ‡y¦çwìUòäçWOþâéáiøÕfc‰$JnýÒÝ£è|«/±ú¿ß­Ü@<¼xv_îI‡ðEÀûîÇnè£Ûðz·Ö^~áÂëævìZÂá¿ýöâÚ"„ÇZÁú<Ÿ^Ô/ëáǵ1æzØ_^沿$Iù§§×¯>ÇùX‡¡j‹yˆÉÔë÷™+åöĘjæ®WºÊñfÓÒáôöúðãþ^|îIpm?ç)­þM îOh ÜËüxÜ_øóÕ†¸ç7úlIñFbTC>zûÅ*k8üÏû·/^ÿðnØ n60‹¼Ôvo‘èÍ+îúi8NáŸnúxCYFv¬C—i_<‘7ƒÆ]o+NñÒ«ï­1~³Ú³ÔÉÖ=Ö? Q€XkÝÕÎÅ…qIÿœ…qo-ž_#ef1öK/»òüúâ@¢Ì¸·»ù>]yÀÅÙ?þËóm.êcZÌÛ\4òŠG8öåôûkZï×.ú ‰ÒNï¡6uØÇ;ð16n«,h®ó°Ív¶æóUCá¼e ¼9µÐóåÝ·Ó,üwÛ/ýÂähü!éêöív„Ü?Ž0Dúù…#Λõ*k'äSARÈeèe[u4ÒløxY¿>”óª¶wgíoÿk^çóaÌùo“»ä´ñî%3¶Tº.ùþõýû}h·éRœ4—Ûé…÷‹~ûòÙ) éœ/tUÚáö> stream xœe’ LSWÇ_ié{|ˆ[åKÖ>3£B£§&f™0uȇ Dçim‹@E@@öõôµå£ ¶å»¨ˆSA-SA6ŒbâÙ²,j–¡Ñh¢3‹Þ²kÜqY\–{srï¹Éÿœû??!ò!d[RªF·oõÚ˜Ô¢â U^ÙBv¹w‰Àéãý@ØâÕÏ7øB ES‘¾5¤yå,FÛß#„A¦R— ÑV••+Ë™V­Š‰áãz&¿Š‰W0[ó J5úý¥%LÞ¾Bf«"IÁ|©ÑóÉ&J³É/Ræ©ö0š=LzÑWLFÚ¦Ô4fKjrFJÚJÅÿúú7A„ŸF{ ¨Xµ:j%A¤Û‰,b3ñ9‘DH?ŸðçFˆ%ñFpÇç3a‚Ð œňX4ô—àf7ÑèòÆ9C3èČЛ€öJQ°â9`bÆ’ÇÑH€Ÿ"‰,±M …l²v§fWî"È‚ãå£eãÆkà ÜU÷xÏÈè©I‡seÊáøT_ãÍ]gºÑzä:ãnrIžM¡®™P:Ê«C*)’Ä=]–œ½·@#›%éW8 ÞWGN·Ù)­&‹ ͉29ÀyÀͯq`)7™h°ŽÊQ2y"ï‚v ¨ç¿Ï¡Hy¢IŠÅ‰Š Å…ÎKjÙ¡>h…²Iè‚Þѳíoµ>9±döú*,–ó]=˜ 4[ÝÈÇVó'‰Ù[Jyõ!n2 j¸ýÃ8Ň=BÔȹs9ÜMnbµ ‚r.\GÒTÛÖPU õÍMcÂby¸8°…C§Ýî4SôE7¹ŸÍ…2ÐB)Tp”Žü: jDâ•ak;F0Ä1õµ»3r Zÿþ×Ã[ébùRtÊs5×®¶ŽöÎû/Â~þmõ5еuÕ&Š>¼`ÌE„!8}ì‚Õ¹ü8QűJpHø™6M…Òw½Rd•¾Èx€ÅK×.Ç‹qÈ“è—HäyÙÛÚÐdbë ²Š-é%™ ¹Zj¦á….ŠiÆjΑa’Òé¸QÜŠ–ý|j nÃ7‰f,¢ÞòƒshÛÝž‡N¤q¼‘æìrJzÆ Ó»ú¯NÏM_kè¥E„7Ó-í®é)•Ñ~) < Ñ©‡Ší¥@mØ’´.u¤ØÞ §{ÕJÈo޽èteæ¡üÈ¢žì@bäólò'‰£àº®ò¡Ù¬²U‡¯¡úºûºkFŽõËí÷Ýcêaùñ“çíý`å1° ¦Ã¨¦h‘Ï¡öÃGet[ö±6ûQ9ŽÃb©0 ˆèéáÃÜÕË^½¦¤é›w¬ÑŸÖ¯Ø<õݰóDŸCN3"ç n/¹‡Ä à!"æyˆæܺ³’“¡ôY¤ ùÏy_’þþ]˜‡ß…yGϳó[ Áí=?4£ =ׄÞà·š\Ãvœ‘{o’½&s­¬0'¥&5B3˜X ,TÃÕ–±êõ©dëÖÈÔ:1ZÎùòbùK \Uùgµ^ðÐ#DÓØ(‹Ñ²ë^Œ‚Ýâ7Z„è+p‹ÅÈê?Þˆ}²åYXX‹ ˆ†„VtK/x/¾(ÇYåÿF^Ù8)ÜiBAÉHºóõ³u@ñ.7ƒÙhfå—³P¦Ͼ…a:;‹ïÛ@5[M–Ž_D>WdHØ…xJU;¼ñHÓÖå»ý]2Qº&ÐŽ™Íf›™ãZ,gÚ]®N ײЎÕ¸ˆ þ±ž±endstream endobj 225 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 413 >> stream xœcd`ab`dd÷ñõM,Éð,IÌÉL64Ò JM/ÍI,I©üfü!ÃôC–¹»ñGå_Önæn–?¸„¾§~Oäÿ'ÀÀÌÈž[íœ_PY”™žQ¢`d``¬« $-’*œô¼“³óË‹³3óR¼ô|õüòË‚™ ùy I©‰9i ùi !© ¡Á®AÁ îAþ¡Ášz؆*ÊÀÀÀ˜ÈÀàÄÀÄÈȲðû¾Ó¦•ý/gÜ|æ{ð1æï¿s‹¶UuwÖV”æÇ'Äts$•l8vhÕw–y[å×^ܵ~S7ÇÙ–Íݵ]òߥ;ˆNhïomêj«i—« ¨ðIêæÈë\:Qß´)›äç_ßð]kÊú3¦Õd7gÔwÊ5,-ØÞÍñ›õ7ßoµßGÏÚµmÍrù©»ªVv¯ì^> stream xœcd`ab`ddôñ ÊÏMÌ3Õ JM/ÍI, ªüfü!ÃôC–¹»û—âÏÖnæn–ƒßï }üîÏÿÝG€™‘1<=ß9¿ ²(3=£DÁÈÀÀXWHZ*$U*8é)x%&gç—gg*$æ¥(xéùê)øå—34òó’R3sÒòÓBR#Bƒ]ƒ‚܃üC‚5õÐã3000:20(1012²t|_Ã÷ŸùÊ$†îíÝÛ¿KoÿZ.$<á—¢ØöBvßõË~/üñS¢ynÇäâîÊîæö¦òßÓþ<”( mŠìæˆgßзµgC÷ŒîK];;8¶³ '—/™7±·¯o²üþï\¬ß¯²ø­0±¾»£»[²8¨;ONxA<ûw³~Ößfßg‹þ^Ïö]ñû5V¾Ò…?œç|Ï›6q!Ûv®¯Ür\,!!ñ<œÝ<Ü«zûz€pr_ÏÄã<<[—MžÜß7¹·¿Ò^˜Ï•endstream endobj 227 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2651 >> stream xœ}V TSg~!$ï¡Ê#,⼄7”Zg´­V‹¢g(.€(JT@À0(ûDE0á†`"²„°AY­Ï¥.µŽÕiÕZG§íxÔ.ÚqZJëÜçüÌq^DmÎÌÉy9'ÿ}¹ÿ½ßw¿ïÿ%”£%‘H\C–†¥l‰I~)À?0esœ}ÉOð‘ã„_I¨Ç9­³œOsžæ†Uc0ÁCFSR‰du|ò”ÔÜôÄMšLÕÌ€€—ýýÅïWT±¹ªÀéªà˜I)9I‰ª˜ä8Uðô¥ÓUËRrÄÅDÕ¤”dUl¼&fs‚*%Aµ2>R®Z¶õkjJ…S+©jµš ¤ÖP ©µÔ"j1õ{*˜ ¡–R˨9”åM©$#(oʑʤ.Ib%§ú¤#¥þÃ1Ëñ{ÙfÙ§ò0y-£›èO˜h'§`§Ë#BGü€]KãS)àq"/¬Ï‘<úȃŸB“ŠG²ÂÖØ Þ)°»hW.1 }ëU¼MW4˜lµŒÝpë¼yfBµ²¼êŽ’¡E~žL”MSË»Œß@?ôÀ]°êrw)ˆVŽrì¹÷¬MÒ‰îhFw©ÐÉ ;c€Ì&s&o2ú®¾†sï  +GÜ+³€P„%, uç8Ywˆ«?Üg9}Зר±$ÂJˆb\;äߥÈ*}mx›ßÆ'õ¸=D9 ;‘‰»¢»'ËPÂÌP wÀ}2~ÁªÍ¹™Üqš­ HP‘LM_0C¼rȰXM£›Ýt2~1.£ÙÀBMÿ‘½>8åû/Q©$îÄ7huðv5œ^ÏVƒêÔЬo!Ô 55=½ïšùðì2â¦ty,¹YgGw€WŸë¡]òÐÅ“$,§"ÚWm\’É¡Œf¯‘WŸÖ§$†ëè‚‹`až… é+-èòh·&Çvæ´·wZz81ý¹Zª¸3É&øtºu]Å‚«ž¬VxU èϱjÞŽkO2Í«N0WÏ\¸õ×»’Wîá Û %`šaO“òSº*rwëAÇ¥UkLÙB¦ñÜØÚ°UÙ£é*¾±ÝV|=V0 f@–oÚµþ®¤¦¶“Å™J"¡µ°s¿¹ Þ²p¬®µîhÒ»ÐÞ8p¢ƒwçPÅ=ø˜Çð·A”«yÁ{²7­8¥Ž¤—$e¤„ÂÅ&ÛÅ9$1\M—ú­4IÇlqùœ´ÉUw²®þù÷®qÃDŸÂ3´ÏT4Ê¥ñà饻 [)P4yó'ÃéW"W¾®k9Íáý"ÛiÕgYß¶~ 7róh1ëúª.[˜ÀKZ…“Rá†à«àét}ri:½Ôt}»®@_²CIb$,¶ÊNór2ZGäF™ú" ‡œ«Ò«¡¼ë`ŸqŸ_EÁËTSn¾Œ‹p¶Ø¶…ÇåÐßæÖ†N‡rOV-œhV4åC>·Ì þ±‰Á$ú‹E—Èä0â²ûå Vm[G§¥ï€¶NWƽmê4TsÝ3_™H/ÒóN ¶p*ŽÎ½ü)ßÛ×ȱ 6ú¸cò†*hV’uH+؃Sgä§Gn´A gÖœ0ríŠ39ÈK…óRás~Mæb”X–GuÉüWu=C7^ì‹®*}Õ®ÝÅ ß½{¶¿×d¤e=bÛ£tÄA _¥1€„Oâ·U» ¢À[Mm¥Cçj÷˜ÊÌ{•P‚ÄC'ú†³Qö”?›ànÃÐ3O5Š£íúL}*OÿûdBàšäœ ÒÏŧzÀÓµõuûkëöRÑÞã_øàäÁ§ª5¬L‹KŽ]W˜AwzÇ[ –ÓmÖcíg€A £‚”íµM8'öŽ4ª‘~Fu†~Ë3ª‡eI¡I©ÈsÓð¼|È73*+*iÉ"ðÞzC‘±¢¼©¬ÌÁŒæÄ”dm\${þƹ ïµq˜$¬3×Å ðUðxœ¨ÁµÇ­ ÝÇÔà˜—pŒ'{OHG'EÍvØ‘[ªÏ/áÒB¢´‘À% ßѳ€¨°ÖétÕJvenž>{çØgsq›0¦P޵%oˆ¥2Äûþ4œŽ¿;€ŒÙÞ©«Â.ºƒøê³mþ¿‘ ;Žök¡d«¾$¯˜ËŽ K ÷ò-Eï“J<#oÜmÅ×ÖœP&ØVí_,†fÍOƱßMÁßâÌþ‡uÊi8VAŠäe݆>ËÁÖžžªv@'(#žÍS^ŠäÚ-ï™B=Ùkv.Æ*úLjn¿©‘¡ñY\)Þ“³~Nð‰Ü7žFÉíã²dÏçHÓpHœÉü´g–ú pû\A¤<Ùìöà— ~4û ´ç|ÿ''u1ÊX¯Ë€¢_cŽÖh¢£­šþ~«µÿ'9|}f«Ÿú4†Ú36 ·<ø­t4èÊókÉ<Üä…5•æí aèRÓ!͇UÚ.vYu{‹H(™ì%¬O–_´ælÄQOZcéö¦½¦†šâæUQP›:fg®èjú@ÙðÁ¡ÒCzæY³ÂOÀdìEÆ£"|höò/ò»Úñ‘žŒx~ä<Á?føñdÿóµa#{Ǭ^³.˹7ó l}Rˆ˜žf?# ~q ýŒ;Ç/jÌyý9ÿ'$–âØr—ªÎ~äÃKšÇ9fJí0VÔZj©F¿âa)l22jºŽA{!Y0îE‚„õ²¿ñòx?DCÌøÆmº×—Œ#?þ¯(îú—Ä”W¾£¼[ |Ÿ©…U^8´êÅÕ<á¾—©ÎPÖal(³@­Ý—?Á-æ/æH°GŠòðà‰J¸F7¾´B=ìÚɽ6²ÉQ7ÈkáŒáýzf¨†(ÕôãC8.~Â=Oa?ÎèÆvKŽÝ¾tgÜ– M¸\!ÞYfókß¾bë8ç˜ïÞ!r¢ š;uÃþ›¸Ù Âà †ŒB*8ë³»èÀ©ðšÖ¦%nH&SnyåU¤ÔÁ!æÊ—æž['b—p–¡‘ŠÙþya“ÃNÞ¼yªßÚÀá¯æI?œ Q¢Ç8(G‰WŒ€¯²Ñ†£;l’‹8¦Ÿ¿j¿e¥ )PACQ.y3êp^KgGc/]­7p­õ½UGùÚ§ÞP”—“£\œò:3ñt”45ƒ©™k£aðÞ»ªŽµÁ ™0´ã¿j©þ“á£Sm’ÃèTºJå ý GæiBK¶¨¹k8d‰ÞâB~OF(ý¨¯“ÁáùE×'ó4ˆ Ã+?¿ ¢O\h¤o•ïß[^Zjâ¶iAËD[µ­:-½¹Ò«ÐéS·Al5gï/`|Éæ¿Ó·þÔõUGcñîJÎ¥°RXQë-û*åü”äF8®Lqvç‘Fƒ¡¬Ü`6:ïìÌ›úªM•ƽåe•FçQõo3ZÏQendstream endobj 228 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 283 >> stream xœcd`ab`dd÷ñõM,É®ÌMÊÏ)6× JM/ÍI,I©üfü!ÃôC–¹»ûç’ïËY»y˜»yXö~Ÿ*ô=Eð{"ÿ÷8fFÆðÜjçü‚Ê¢ÌôŒ#c]] i©T©à¤§à•˜œ_^œ©˜—¢à¥ç«§à—_ÌTÐÈÏSHJÍHÌISÈOSIP v Vpò ÖÔÃî4TQF ^ÆÀÄÈÈ¢ó} ßæš; ßËö0Ü'º¤¤»VîÏ;¶Ú’î¢âÅÝ3ä¼c›±¸{±<_ãÔÍ~ -ß´m×n9.æp{Înîå{zz§öLš0¡o7sNßä‰Syx`lëendstream endobj 229 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 616 >> stream xœcd`ab`ddóñõM,Éð,IÌÉL6× JM/ÍI,ɨüfü!ÃôC–¹»ñÇí¾¬Ý<ÌÝ<,~\úž"ø=žÿ{´3#cxN¥s~AeQfzF‰‚‘±®.´THªTpÒSðJLÎÎ//ÎÎTHÌKQðÒóÕSðË/ f*häç)$¥f$æ¤)ä§)„¤F(„»+¸ù‡kêauŠ SbƒC$3Ð; , «Ó¾¯áûÏ”½Š¡qùùåŒ'î0ÿ8ÿ]YtF]wGmW{A‹\}tE@b7GaËÂes&¯Ÿ´T~áÓ©z&NY#9qéô]Ý8VN­®*©Ïo•+[“¹4º›ã·Èo±ßŠ¿U´Î¸=<¸{Õ¦Íòóü6.í^ß½dáÜU 7Í8ÒÝÏñÛê»­hÌoÿ–üÒòÒ É¦æäì„nŽ´ô¥—¬øÎ´h³üÎÛûf-ïæ¸8Ͼ¡½³¥«CèÌö‹@gn=ýÝûùÌ医ß|õšùǸkÛêÛåÊÜüû9’Ë–m\ºøÙòïÌòóoìX²¦»»{M÷‚Úì¦úüîJŽÒ95‹­™·õ°÷œäÈä¬ÔR¹Ê-±+Ú~³xÿæÏ­›ÙÝ7£§Æù%7OmÛÓͱfYety}dS¦|æoÙÆÌ¬ÐˆnÉŽîÜî²™[fô­ïžÈ±°jVI~^qZäá’=;·¬ØºDnqØ¡ÊÍÝßÙO|\.ÏW>ÿ‡óÔ©Ó¿Ìg[Îu™[Ž‹%$Ÿ‡³›‡{yO_Oßôž 3&MœÎó¶·wMLìÑÃÃËÀúSendstream endobj 230 0 obj << /Filter /FlateDecode /Length 161 >> stream xœ]O1à Üy…I†.Q–tÉЪjûbLÄ@„ ý}î$ûîä3§ëdMþ_A«mnH0Ób,kZPc ã*=ããMú÷Ç$éc¾Ë•ø³í.eÕ!tŠ6/‘‚´ ±^ˆ¡×z`dÕŸT³®Î.93„Hœý§’£¹Äypl,MK“\ÀXú=ãÏ)H`_+)S#endstream endobj 231 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 355 >> stream xœcd`ab`ddôñ ÊÏMÌ3× JM/ÍI, ªüfü!ÃôC–¹»üÇŒŸ:¬Ý<ÌÝ<,¾ú$øÝŸÿ»3#cxz¾s~AeQfzF‰‚‘±®.´THªTpÒSðJLÎÎ//ÎÎTHÌKQðÒóÕSðË/ f*häç)$¥f$æ¤)ä§)„¤F(„»+¸ù‡kê¡; Æg```4``d`bdd)ø¾†ï?“e!CùòŸË÷?û¾îóß/‹vgª»{1g§ïfënŽß5Ý¿—:;wÿžÿ½æ{M÷÷ù—å fˆv;v;Öù”¸—&wÇvû-+¿[{¬ûn÷Õî+Ý×gZpëô‚-Ý»÷gÍ œÚãÜmÂÁW>ÿ‡ó¬ïyS§Ìg[Ïu‹[Ž‹%$Ÿ‡³›‡{ioooO_ï¤ÞI«Wðð,ŸØ»©¿§RÿäþI<¼ ãó endstream endobj 232 0 obj << /Filter /FlateDecode /Length 419 >> stream xœ]“±nã@C{}…þÀ²´;sŒi’&E‚àî~@^­‘Å)ò÷!çŠ+(àÙ.‰Yî×åÚ^öKùS¯í¼¬Ó^ß/{©í¹¾.ksìÛi)×éYÞÆ­9Ü?ÛßÏ­¶x¡Îßü<¾ÕÃï¾7ýtü*—©¾oc©û¸¾ÖæÔuqšçhê:ý÷WºMœçÛ«ý¯ºOà]HÀ;b Xˆ5$`8†ê:<Ç€Gb°'!b ˜ˆ8sйÏÆ€#0Á5É9Ñ9Á&É*Ñ*候›$«D«t x&N!'`FÀ¬™!3\³œ33f…Ì ™-$  ‰L©Œ© s¦Yã¬aÎ4kœ54…4†4ؘ¬LVЉXˆi)Æ¥Ú˜bZŠq)†6¦FÆF†ý˜vdÜ‘Í!q!NŽu¹Væ\™£º«¾³¾#¾«‚³‚#¾«‚³‚#¾«‚³‚#¾«‚³‚#¾«‚³‚#¯+3ž¼ˆ?7Žw’·ûç2·åcßëzÕ' +Λ½¬õßW²]6NµPói#Ó–endstream endobj 233 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5154 >> stream xœ­X TSwº¿1¯KµŠ©¤uîEÇq´UŸÛ¸µN븋;¢Ùb dÙ÷|ÉÍF ¬”EqÁ¥÷V­]µŽÖé:yóN[çæòNß?€3¾Î<ß¼w8p ç^î÷ÿ~Ë÷û.‡>Œàp8ã7nÚ–ž'ž7wöº¬¸TaBðÃé8ÉÃ?ãf²Ì_ä}êÃ…1Ãߘ,øfzk<*‡"Ÿ%¸NT²dUº$?S˜œ’>îܳgãŸKÃãóÃWÎ _— JÏ=$†Ç‰Ã×ÏÙ4'|sz.þP>#] %.5)<=)|ÇÝá;·GlÛ¾f[äÎ-ÛgÎùqYý› ˆ™+Äé«$™‡²²×åäÆmÈOØ”x )9e›pûŽÔ]ióæ/X¸tÙŒ™³æà‹§‘Äb±•˜Nl'v;‰]Ä‹D±›XIÌ"ö«‰9Dñb ±–XG, Ö ‰_›ˆÅÄfbJL$øÄóÄ ÄHbñ 1ŽO¼ˆûF 'ê8¯sŽ[8ì1÷îð˜áwC¢x#xJ^߈7É=#7ì3zéèÇcÆ|ÿŒ{ìæq‹Æ]z¶d|üø»„¡ ¡'Öñ·>úœ÷¹‡“–M*šôÞ¤@X:2öûa_ì$Àöøûr9—úžáö­õòK4 2ºêMTlÏì33RHÁ Õ)Ù‡ý÷Ãb_5¤˜”fs>i´¨=u‡¨§üÐllÒ^• h,´Î’l?Ù‹‹*î  a(ça—…äRÄ*§(¦­ƒvªZGtƒ—fW#=Ÿ=ÀC›Ñ½\ßü%„Ò˜íãB/z¯p¿E?ç»5 •ƒ©Ð@i$’™[Ì1—•Ö¹ë]µtÕùN4zÉû;|{–îÌ“SÚ3¦XH†Ü,iZ^‚|3®Yå{‰Åâ³SÞÛ•gü@ÖƒX)5æ¤ôkìy“ά£@é*¬*®pV:©´ÐîsTÛ}‚’³`©8\ZÛýþ@ž°ÆälÚÏŽ–%Ðr¡Q 9äþÆäÓ_E3íÔØï9ßO* »Šosäçÿ~Ë­…ì³,ŸÊNŸvmÓoѳˆ¦¢_RÇø›=M)Þ±;f‰Iþ;=õˆÛ|n»rºég÷o¡qC®3D¶¿o¶Ÿƒ^|Äí;Û·œo±Y`#ÁìV”jjãŠØ[[Ë£AÀƳ"6›U°Kþ< Q( qÐÁÓø*½N #½›]ÎŽß°ÈÅ .¢©Wëм{h}ó‹/N~äãÖ—fèE`¤ƒíò0– ÛбØ]~4k“È·¹':Æÿsä™È=±ÉB1¥è)Î|Švë@ªM§Y^Œ&UcL4 Ô˜Z»ÞÙ€ÉÔH7ÃQ#¾ÒÉT¬Ùnp¸Îz[9ÝŠ¦; êâÏf4šfÒì8v-_‘±È­ª‡.ÆÂX]ô)´ÕuôêÝ7@ÐíÞ&Š“°£Å‚ýk üeÿ'~´ØÏ¹Ú÷*·o¾GFLé,5µ•¥RÖ³ €dÇòRq:·ÅAßB!x7R‰Ö\¨Ó`Ònpx«×F¿$ø¡nA± r0æè¨¼ÕyÙË€\Æ»‚Ì®#NË\òx"êÒVKLrã!Ú¬7«ÁH*<`+µØ¼VªE0õ:ÈA2¯@ùr'Tõ‚F  1ÒìóýG4Bf V£ë§ÊéÀ!^X,βOQz˜ÅÊàHŒR½Ÿpç Ïî–aŒf>àdqüsë=“-¥”ç+þ‹’hrvY©¨ÌÂt#þ' °C#TÉR”FèIyQ^½×_z,È”’ßa¼y͹كE0ç"šð&7ð34–{ã‹ÒÉ.è"k«oÞkhS%z(‘A#©tÔVÔwŒ?¶ŽÿRÔ¯oÈuÔ U· v’"ÉËÓ²·ÚÏJ©³v8 ¯”—äd¥ÄlîM~½ØŽÆž >{ã€kü(*³ä2†lCæ| •¿7áµm@J ®Ü åÎFú=ÔòWáÁlSƒ”~™×†fØJÁ vAu]•©ÊÁf“È.YÄ+xÒú{¼Ul‡Ù`‚L}$áÜœTþ°0ÿåÿÛ•²‹Ü@ï“g›ÍÙ:J¶=o£È h(|öÔiuXìÀ<š²Ü4­Xc¢V²Ýú|0©å‚¼tqÚ~ cÔ'Ž\9òYÝMÚUm/…J²ç ?vN ;C7ˆœµÔF¹ü ¿ïÒã1fRId‰tFDÆ ˆ"öŠ/œ?ÚÔTKywvé*¡ ªëÊüÞöâ˃dQY±"ú8~Λ-\ôy%¿X¹›ÀépÚÊ(ôB ÍÕì(º‚j÷€ qFˆ§ã!–‰÷t€¨GCÑ$7ivr§æ Z³9jÈW:MÎŽã tÒÐeìÒ‰UM Äuiî•Ò‹hä§Ü€*0†ß¢ð‹³2³²äN­CKÕf0"l¬éûX;b§²çHoó£†;”½ÜQö”=H]” ûȹ×Å—Ð+'ÑÖ*Éx‚м+%^A«>åömúO‡ÑÔ‚øì(Qüë@FK;Yj='èãè‡ÏݶØÄZ †m›§M7ç`B(S—슀÷J.Ô¿ç¿O9+íO[o4;2@B—°þPsz·±𡥤élYR‡ä\†ãMï4Ý<†æÀyò‡cæ7¹ß?gÚMT÷R‹´B½™Êë•‹°×qÙQì,vú¢“ï·ž¨>ÓA{ö´å´ü=WØ5y|hÓ²@îÓ\jêñ£‘ÞãtÝ•“=xÖEÅYkÒa“åŸ Qêj_;·/SJ j*Ù¢p*üì$ô§0´Í®©¼ùæ[Ëâ¶@é4ص9™FÈ¢RàƒëÖÉ!OYd¶Ó¥æb=È ¿ P*g¿cO†ÝEw\Í.×5LÈ"ðz´Víx#$Ò Ï$Þ¨pA¥¿L;ÐßñCçôÓÞÉÀ1º:x¶:qò(ÑBîVp9\Ív/Ý‚¦!ø–mv‚ {Ÿè€YdzÌ­Çh£špÞ9 d‘ËV†ÌùŒ!Ø8z-Æ„¿Xú“BÿX`äÿ1@YÖ ü”Vœ¹ÿWeŸô×–”PØ¥+öG¹WÖn‹Õi¡ýöâ('«¥ž|*Ô®HÔmê¾ñíçßü{Ý öPûÝîÁt÷Hù–o×x4³Y¥¡VÌžo(rgfwïù†ïêOÓ­7zZºÁݦ²øhÄb2H=Òš†Z_û™Ø¶ O"ÍŒKë~‡&þöOeXd\¥ˆoýånß=+‡: à´•ö ˆ3gÍNäeƒ”ùì—ýWözM>Â9FÀÀíïAØ_,Û~@ch”æ|µÃèl:Ê€g‡–ì€A-ÖZô6«©Ê€‡­ aÞ•þo¬ -A ØO`dÌNé¿ö#ž´a¬ÛévÌ“¶AžÐ?J:ÎA^ó?^™£–F?ÜÊE:FcT™ÍFj†FaVš!O tCéi«Ve4ʧy¡_Ò‡ýT’\›Ãפn~ù§$邳7Ý-u‹!ŒfƒIG/ñ¡—1ò¼[HßþÓȯW¾s¬ÝÝíl ñšàmætåÝf¸NòdÒ± SÙŸOg#æ^ôûA¬c‘‹?…] ©^Zò !dGDìÔ|P•÷y~4û£j'óºŠÉî¾P~W|MüÌLö9¡–Êa‡…¬ bœ‹›QF_å­ì©Ø¤Š×å4ByT2¨ Q–5ÙKk¡Šô廥™™¹)1]9mßv¢¤V'u±!÷yî!"-ç5£E®6ÏùV¸ ÚT"MÓËA.™íU•×ÕUµP¸A¹nð¦E€1µ‘8õ¶2춇TdiÄJvXÒ‹;=œÁÎ`§,:µæý³]ÅÅtÎbE´.'](HØ—… ‡Txª\ÅÕØÍJÔ•ù©²Ä„¶üß}ðÖ•”Eaóܼ#µÓôçtY}Š®»p¢Ðå¢ÅÚ( ù1·ì<ÍO¿ó¬MIIK¥ÞEÝOI7vFÿ#³É¬Ä—*‹ +«K*< Õ…V -‚wÉ»¯ÞbÇSlÅO‰;yHhŠPƒEúÂ_½<¸EÒÇþ»—ÛÀj+¥o òDðŽŸ“®’Õ²í´rŸAydhçŠ+¢kš»¨Y$>è svîLGg­r:ßålrYVÓÚ •@^ÿ#Ì¢ô@O@/žzcRè‡èÁß#$–¼„ÒÈ, õ%GJÚèëèU÷a+>ˆàuI³…ìLýß̽èHý—æ®Ï:¤kóè´%I3d X ‚ÄÚøs_A/Ú¨Ðð†@ ¿ºÐ—&¥Š²Ës77û›©Á /„s9hïM´¹©ùpXۙќéW0³óì©Ez«°¬ :Éû~úð«Æ5+2ÌZC6e–…üm»;‡WIAp•Ô›Íx•ŒÙžøöjK.v£q,ˆòíê•УOWf8# ;Wè2Vä{džlH&ç.ÿåü×^ký¶ÆÞÀxðÌ ñ¨A§0[Å0iÍF »Z“N·W5Ô•P-¥×!ßê˜súáèû%·/з&òÄ™TdÄ8&Ვ.p™érs­Y¹2× e÷ç†íT‡4·¸Kƒ ‘ŒI F8@ !…9¤>¯p-=Vu¦•¾ÜßoͳèËñæ v‹Ç‹¾¼Öñv‹§qYðQ‰Ëáλ<Rû^âô=åKœ[«öEDïߟFinEUÆ@$ì9(|ýÿõ…ΰWîéê½äIØ](ÑŠMjz=[ò¿¹éŸ¿Â!h\.'ð+‚U˜ºž ,rK6£³`Z9¬E[ø°AäI—Φәͅ ê×Ó"´b£>ˆ~‰yj+;ãh9E±£úÅ‘FµšA {ÀÖÕÍ@}NO<Ù¯ž}ÛéCÅ>t ¹¥Mh ÞÞáŠÑâ'qEŠ\|âÚµ‰.©-Ù•X” JP›LæžOÞíô{ÑœGŸ_Ä'шå–³3–²1ës±Ýw£1í^u‹\§Ç„ƒÅD969(HqÒ”Í •½ñÆûh ÛyJ²„ýÅÂÅ3¶P1’¸CqQ‹•«‡0+¶Zñ¸q5z[q˜†ÆÜº‚ú|6Þш“h¥çÉ|èŽÿ*ˆ¾ hoÓ™ËÙ¾Ûw|—'…(Yh?* ï¾ÚòmKïçðùpý™åìèéS¥TŠÛÚN¶ôT*ýŠ`…F‹‰ÑQà’ Eéâ\]¥÷îç_ý¡ítþ*©ŠÝÂ.¥³x¡½DPå‚ º‘WÙkZ–¯žI§ _ÏŒhˆn2½×e(iƒ2²\YžµÛ™¿ætäCì\¾Ccž¼[‘ƒÖø«ü¯s9'+¹q)߮æeƒŠÊ×fâx¥Åè-'ÐoÂÂCÖ²Ót*Ž]¶²¾S.v ’< ¼|Èͨ1½èCܵ`,ë²$Zê ;~?;f5K¾ÂNœa0j¢’§Üå(+vy¨"W‘óx¡ Z”—²Â’Ø™†à*cäTèÝ•%žÕ†¦;Ì.p€ ñFIù“v7¶ÝûÚ˜V‡sÙnp=B~ —ØçØIl(ú3bêØáhÄå§üTÆ”ÌÈýÛs2öFmÂ$:å‡OÛ˜°“¥o†0_œ¼ë¤äê×>~ûõ'4¥EÀ rýUþªXVÅþl5¼[ÚÞ„^h졊}]7ßòlùÞØ¡1 Q:²!ˆ“Ž8“B¢Ìk|Ÿ´:]t0í`†· þ¨ÿHõ1úˆ_#­J§B·SE©Yå¹GýÍ~z𠛟ó—Â\šÕÃEµ¬–6­{ç}ÍC¸ hò¥À¤E±¥¥ †Ái`tJvÄ2vêBŠÆ®Kew@8l)Úè®[Ûµµï6›ãGÿùa70!͇Kêkù=™oÇöʰ· AM8Uô…¥®Eìä-ý#X-+“™Í`$µ6£ÃƒF|Œ¦>¢Ð0´ÎvÀŸÉ¡ÀüZÚù˜ƒÏÍ墬Sü#²zQBfŠXT£ª®*÷ØìTᯣ7ìKP`ù‚42Z§CÏ ÑÔ“¾oæp²_O4Õ†-aäutã*7 AKø_¶£ùð1Ù¡GϱüU/ïcy‘Ôž9±ì*˜O¦K£çßúªýâõÒ:~ö¾èÝQ@Šb«>ºÿ>:Ýr‡n{ÿ‚ï(­iVD°­±³è±Ù¾À*:d-÷ñ|£.ަF ß±cÿ˜‘0f´ÁA«°9ÆŒi¯À¿;­¥{e zÌ3ñ_Yæâendstream endobj 234 0 obj << /Filter /FlateDecode /Length 9242 >> stream xœí}M“$Çq%ö:'íaO«C«W¨šŒïšqÍ RDÚå`v÷€¡­g&»§‡Ý/ý‚ýÙûž{dfxMÍ`B&“¬ŒNÕkÏHÿŒÌúófÚ»ÍÄÿõ_Þ>™6WOþüÄ ºéÿ¼¼Ýüíó'OŸùdߦæ6Ï¿|¢—¸Mu›’ʾ…´y~ûd[/žÿ´Å´!í]® þêÉÛO.<è«Û—»i?¥¦Tí—¯/ø9VßÚöþðx9þíæû‹]Cäí¯înß ¤zYj±ÖíãõëáÛÕÅïŸÿŒ; çö5.œÝÜ]]ì\ØO®úí‹­ë׸6^ãóÞëÛt²GcÊÇyÈÎyu5×íwoä[Ì­ŒzxsùGà'0´ýã<`nö!ÄÎÎAÙ±ã¥}Éyš9þã)Ž1á0M] Û/.N.bÝ»V×U|x0s;úúª¯QˆÛ?p½§Ð¶²n¸Ù„ÅùJÖ&7µ.£ìsöE'YâxçR÷Å—ùÆÏúŠëµ_Ÿï»ˆÞR¾©¤ùêñÚÃKÑÄ=úÓáꘋ¿{þäw”¦K›«ÙµîÁFöPW7¡Uù:÷as¹ù?›×e›rΛo±A~ƒÿþøƒb9÷‰¢Ã<üæÙß?q\©œJ†onDH+o°VyŸÓæHš8>lŸŽ”}h@œßÇ(HŽ{\”bäp 4ÚIhMP í±ür§P©ÐàˆQBÛ§,H ûnî˜=èÃ>ËÀøKQ¤ì1…œ’ßW¹*¸Ä©¦ìð÷̱å}ÒQ<îfRÆlåÞ!dÈ€s {pƒ†‹Rm½§›£›©ûf"ž” ˆODä䈿/7›JS'`·–¯eïÁKˆoH¤Å}ô£Äãäö™Ì¤¸÷M‘ $L{8¹š(˜1È0ÑQ‹.uÒVuP’Pöä6·=t’Ö ŸpkGX™¡ÈŠ"—ËJF8C°\8Y‹db ØÞ\JlN½UÅô eeSŽ¡¶¢F ™tœ–D¸PU¤—&¿Ï\¨6uQ¤©ñopÚWá09îb P]©>‚ç8ž| X!Ò@½ƒŽƒ»–¨órz¯˜ö-‘K#@ {G–¹iõ¢,·€ÎBó(ûDUƒ&EJÜsRª¡£T/zža@UרRžlÜׂ`ÂQ˜ \! ÔÃÌ}öа—ÁEåc*º¥xˆ;s‰šL3ûDý€¸Ü<lç{â•›«ˆDS_ó³hzöµ¯ vÎÞQ¹°ýte0Ê ÿ^-Hå& &ª„R¨o>Î#cêM6¢ãxD0e‘…þ{"’—PºôÊEѹ*:¥"ž4X÷–iä £N}º>ò‚­¤Â*ÃÌRu¢€:ƒ—Pc_ÌóÐúÍE‘Jª:ªhéª^²WE‚ÐjGZWuß»À~‰Å„Êr j1±%;‚õ &ñ*å†R£"áH…1åʼ=*l) &·R’;U?uM‚•íHMB(Ñm_ Q-&4AI {L^”ª"•“‘=DZ5eQ¤9FErEê;’H¡« )ŽÝˆÖRÔ²aG«Ñ¯5qéֹ׉`zyÜË'E™ÇêA‚4š¹¨{ÈÉ$´¬ª-“¯Æ ‡Å,4¨ªK†½ ÓD˜·\MHm’[7ø­¢º§Ü5ܱ‘ºK½3Ü–£cÀ*DÑ¿·…%ƒÐ …O~+qy¡ïj°Ý¾Øø©»©†y·ªV_ÝTÃÎA¸ƒmÇàˆŸ&êœáB ‰EÕEKü„Ë+•ŸF¥ ‚E›¢nߦWÚs#ÂX‰ªû‰Ìs¡«®וÉNêšã'˜ÆJÿ,Ö@ðÅ¥ jDýDŸ@d¶.~§b2aîû¸ðØb2ar M“fÏê'h¢Ý/º9½£šUÝ ²‡€T5šQâ–´ÕJjä=ÂQ$z*±‡›E˺}µ™œ“Ž ç•“ÞIeß Š„P”›_&ºÁ¹ˆ†L5}Ö}ï¸ácâ]Õ&ÄëEø›ªRR³ê¡Kb2)s18K%&“q‰˜L ×@¹<Ê„!ƒ èA)¾èTÿ¼Ç‚ЋsÁU|ž‹n<Ïv%q㸣®¦§Gpº ªmžk&ò+º‡¼bTþ"7 ×%ª^gõ°itã ºU“"UÝ8n^ô*¬½ëO5'ÀwI4©Ë^Ä&qãH04j"|ÀäÝzžKÜxˆ* †éBkT¤‰ªÓ$ª|W&;­L+`$Œ¹³²Ä2™ÎQŰ—» Òup]‰v>iÄ{ñ1YÇ­â‘D ‚2 ïEUØœ*ŠïŠ.°XVá½h5hÅÎ;‹ØM6âë¬V Ë$#\—§¹‹‰à–b2]Ê€1™dF'4 Š&q”$‹!ÌŒG”ÈÞW5ûºŸ#.Õ4kì¥[ûQ¨2ù¾•±cÕDW­@à %†¹ÕÅi“$ÁÐÄÐGn.«Ÿceß<3gÉÝ: ¬ÈÔã-§@ÕhµÖn0}xZ¢…†¥•¼Û@íaƒÇ–`P-EcÕIœ]ëŠÝJÔ¤‡V]/¡Ñ çu{¯wæ%žhšúÆô'h £q¥Âƒ IL†\&x-zpϘ<)RzÒãç«ÔÂpÍ©áüœ7æ»iLzbžÔ_‡)J¼)dQ^K‚ÁÔd˜@]% (ªn@j×õª¾.L0s’÷à*½n+Š;ô{eFíØãI„ŠÈY±IðÌQL&BÌB`í‘6“¶IÔHU›™ºªçµLD» ½L”EÁˆÄIm&f ) ¢¡à„ÇlBB…Òeƒ¬VæòÑBQvÊ0¼–˜Ì©j±! éQ-§wÒ[·^%šC} ¥›ÌÚ× 1°&=«˜Õàuß,Mô(Îß½‰X;ó’h•F5ËxÍu!ªÑ*QÒ’ º4`XRœà³¯ÊWhœD©¬‘u¤ˆ÷¦wz#¸-zo–ctŽØ”ôÞôAïÃñ¦¯bA”H3VsP›ÛÝú” õߨ`:¥ >ª¾¯HZŠAª¤<Çå ;…ù®XÉZ(- H±ƒÀmyg‘v¤í¥i•hE*Kõfœêd«D EâµP4 A E#ÐŽ”©Ær¤í5i¡h@²ŠF¤)S…öÊTk/­H“BÑ”#]jÌÍâ5§…¢ÑBÑ€x- ¼—Õ¥Óku©Á{9K“Ò‘‰kð^v`x©jY.áü—72mÍ){ƒËãÈqš¤ 2"ì‹VƒÀ7¤Hî3 ð`ÅŽ»‹4qå/,?ðbÉòS¤Îo eF„u#˼X´ü4©N ˆciøa‡oJñZ.- ;ÃcÏi²ÖH±Ö3:¸±dÙ)R<4H•¨p@j¶Ö‘G°Ö3z:n «Op×ÉÏè½·ÆH³ú=ü˜Õ'ƒUøè“³ÆHÝÛ[±,iÙ)ÞÏÈöf³ìÀ9Ë}†&LÎút ÕúôØé3K|8RxLvvú Ë­>³ÄpüGúØê³ã°ÕgÙa«Ï²S'ëÓÔ½½¼˜ñé‘)‹ñé‘h52L ;,Czà رX¤J€8 Q*#’´p4 Y+G#R¤ > ðàÅŒ`«ï,í:ËOËÖ~"f 6DŒ‰Í> Tk?còÉÚOÌÁ©3x«ïR5ì°§lí'+ V˜#¹³jÕ‰Eck>Ù³µêÄ*¨U§<Å#ó™;2ŸRÒ4ìd9ê2!©+£vÜX¬S™í>Ã1[(Æ©GvÆ“å˜í>#ÒÌvŸå˜5AË1™¸°ÝgØ)LÀͬ û}ö*öû ;…ý>ÃN‰îHÝK¬Gê^àÇìÍáÆ‚EØï³ì°ßgäU´—:"pcβ7ÌJÔ)i{uÁj{eÇÏY¤Ú„(Vvü ;UkFiGƳ¦rd<+ܘ·w/Îj{-õHÛÙé´Æ³²ãgØiðbV›ܘզæâ‘ñd³ÓhÓçý´OÖÓ>ÕMä?<´‰<™«àØ®@\Òú¼ï¬œƒ-j-2ºñ°\ :½³_îàÔybî;¶’ÃF?á¸Ñx©6ÁÎakÖ ;æ÷¸Ñ«'¬µÀõŒÇ6çcGçcGçcGçcGçcGçcGçcGçcGçcGçcGçcGçcGçcGçcGçcGçcGçcGçcGçcGçcGçcGê~ÎÇŽFä|ìhDÎÇŽä|ì¨#çcG+r>v4"çcG+r>v4"çcG r>v4 çcG+p>v´"çcGòáØÑfhB—#< C°êöD6 ¸›oŸ°Ùâ7´_òÿpÛÃ…Š×ÀëviKÏÈÚ—.<­ã†¾t¡Wì \íK6¦œ¶†µ/]¼ë™òÜ—.®¹~B¨÷¥ Cí¶÷ÆtaNO£ôÆtqlymÖ¾taE*I7¶÷¥ËÔze~îK—‰Eر/æhÓ×¾t™ÂÜ.î}é2ñt^ÕûÒ­Íý¹/Ípï÷¾tKÓÜî­iFÒ:­¹5MZ%éi*H;Ó–Ä™Ît…EJ¦3-J®åÞ™æÖЙÏi®b6i¸U^sgš^WxîL]›Ÿ¿3]ëŒÌé"uÚ¥-]]/ŽÿÌmiÈ#êUç¶ô¹-}nKŸÛÒç¶ô¹-}nKŸÛÒç¶ô¹-}nKŸÛÒ7ç¶ôŠœÛÒ rnKȹ-==·¥äÜ–s[zEÎmé9·¥äÜ–^‘s[zDÎmé8·¥WäÜ–^‘méiYÎë»%æïÚ‘F¼ƒ8ŽÕæ¼a6ýŽ>ô\ñ]ûÐsÅŠ•45ž+¾…NNë½â[X¶Ðc¯øi×{ÏõÞs½·#çzë½+r®÷ȹÞ;#çzë½9×{Wà\ï]‘s½wEÎõÞ9×{Wä\ïs½wAþ]Ö{µª»þ€ù©.‡oR<¬$¶ï-ÍwÖò®":Ö½•˜o#^ÆrÌ¢Ü8VG~¾Ç£–{ñq˜Æ{uä/¨yσg>wS½>#ü'¼.š™©|ŠŠ,òºè›»+¾0š×´ÍÊaAF*6l$¥\¨fd ’ÔªŒrX‘Š’H¤¶PÍÈHu´fÃ*T?Á°3ž3óÙ­Øhؿئ‹—JMݺ Ÿù”@Äç$Ÿá·~€ý ç¼ RÿœÂ6N+ML+MšVš4Œ“'Ù² œ›³Äy‰©Y ~‹jA˜•K‡•T,RCÕ‘‘* ;3+· † Ñr©†ª##_ú\F]Y‘Š9Qufgud¤bu¶Ž*¼ #_nÞÌgÄP!ìkf¬©j¨ó.T32Rµ¹¬½îøŽ T~ŠÓ¸Eåëøw7 ƒ’1T%jj¸Rud¤bÁ‹0#†ªèc«UGFª{”¿PÍÈHÅÇ»b,UGF*>Íi˜ïÀHÃz¶7r˜CUôìUGF*éµ›ÎÈHźƒ‘ÃŒ TaBF9,ÈHåÿ…Q b¨JÓ*ØJÕ‘‘*¸žè.T3b¨ªVV"F>2šF9,ÈH•x°c”邌T|;9ÌÈHUœþDÇJ5#† <9ÌÈHÅÄ.9ÌÈHÕjмmõJ¨"†/£$d¤‚»°vrA Uvt êÈH\µvrA UMÖN.ÈHÅß 0vrAF*>s[ÍX32Rñauc'd¤bYÂØÉ1T|$ÞHbFF*¶QÚ¨9 2R5Ëz;âûØû þp´É˯öhf}» ëñ§ÓT|Ùfä U䩜‘HC“sê>`&ꈡbÑ!ªŽŒT…­d+ÕŒªõE#3Õ0Ãñ Q“0‚?#“$ÑE ´Dï<~4ù(—0Ç]qWFñ’0¸z:ÒŸ‰;Š`Z²Þ=ôqËŒ ‡û£ÇÍÂoøÀq9¤%9Ä%9„%íZ÷†˜Sú[>?EÔÇWÀÒh¥z$RÄR!˜,•"†*8yKÅ@ÕK“ŽDt¤RÄRIZFªÒσTM^21R)bMƒ“ßð¨:b©¼ÔãG*ßOŽTAÿTŠX*=ø3RÍGªä{™m¡J~)³­TI•T©3©àN§l¨±p:–DG,•“^ÓH¥ˆ¥ òÓP#•"–ŠG4 ÷±TIš#Uê‡Qª¢¯T¨:b©²´pF*E,U•‡ÔGªÚ[]Á$ǵªŽX*/‡bG*ßÉŽT¡펎X*Öá ‘–&˹БHC%G ŒL;b©ø»gf;b©ZÒšíJÕÒ\³]]¢;’ÃŒX*Øgˆ°41Ù1#–*»cgÄRñåÍP)b¨OšªŽX*žx4wìˆuú“·:?#–ÊÉAKà , ‚!³+fÄRåhwëŒX*õ"#ÕêW¤æç§÷Ë‹ÓÒ™ÐÞÀéBà²+y* Hؘõ…Bù)?=yòVÇŸ¾Õ *¾øJ^5¶RQŽì¼¿¸ÕNs<üÇRrB>H,wy2$@ÔŸªæ÷p=&xi ±ÈÜ~æEÙím¦½C¸©ÿÿìïßS)|CTåøq2©^GFªßýÔ%ü0ÆŽ™øŽoe6Sïf¤¢Ì«¬ü[üÜÿè:'ïT´ï•ðZçD°¾c΀´| ³Öš£Ù§oäÓ†¿×85gòhß(†åŸ^_}}©'žRlÛûË‹]€wƒu܆_\ì"‘ײ}vÉþÉ”Z˜RÝÞ¯¿¹ðu;S'·5÷÷w÷ýoõÅö›ëCïy0ØŠXé°´HžÝ¾˜ùR>C;*Fœ/7³âá’PË|ùǸ¥ ÂðC秺šW>cìƒê î.v<Ö^SÞÞ=¾ÿð¸Ì _¾ÔÏ-QZûuDÞû÷®öéEà›ôRLãJh‹±û£ÇËG«Êv뉭†‘}3w³ì}¶nûj@¯ÿ« 1{ÿÝXEúú‚oËBf¿}œï•¶ß^@ž|ùöp!’-mûýCÿ{kÛÇ»õók¡ m;2rkïx½iï|`ûÄöÊB¿ìœ”˜Ãöpsó=²ñT_™ÿ¤zx×õ)VßìG}UÕ F¶|[Xš»K/9r÷6ð×vÒDC$1!‚ʔΆˆ]ÍÝ@ˆÝÍxÒëÑ}Vd,F-ç›Ci=hxwl½Ð½¼À>ï''š¹WlÆG§¸ÑÖ’òyXcIy–g4¥°¸˜z-νoZ"?Ül7Ž5Ÿ°8ÞfÁ/'ˆ¾Ø^S+K·}0Õ|™½šFF7×G{n¥|ÅñÈF‚–¥x ÷†Mpä Òäþ¼¡ú³Ùý×w¯;£Ñÿ<{&ÔŒ°{QH™TÅË_ñà#<ã0Þ²gvò®Å)oÿqžb×1è<<<\éŠA¥†6¼0i0I‰Å´dlÛo”Ô…‘ôpóp7›0'¼YÖQwæDO-Äí·d“]ŸXfÛª$.\bt]Ñ Ç芉òÖ&mß(©J™@i^nÞK£á÷º@Ǹ†y«]Þ÷¸k9>9vÂ|´£8àØ ©+íÿŒ ü²l³aôR½ºÃN])¿m)Žc®Jïy"è:ž¦F]d&1“ugKÍÂÅnbYÈT¸úââàKG}¼6;ø‰¶]ÎoŽu÷'õ‰?Ë¦Žš U¹Þ›ÛïåONìÒ·× xNùvÚ‡­Óf0~ëLfø(VIsûì¿|ôЭü>Øt÷åQôºÞ[¬…7Õž.÷ çîvÖŸ‰9Zãm4`T›“5ž-(ËffrÔ1EG̓¡ÊR11®K AÄÇ?®¨|Ã;7ÿõÅÁ8üJu2Ôê=8åG¾ð_µf ös •xj„×ÂüáÏØfÒ(Q˜øüòAØ`æï·ãç5Rh .Wfâ ·½»¿U×¢7B\»&¬|ú{óü³'Ïÿäóß±½ù.}èÚãÝgðaß½Ø>\>p?bÄ»X³I’įßܽ<Ü\þòÓO>ûüïÖƒ¾ÉÄ‹|È—Ì¢ š·ÿï¤q‡OË1âgsÖPÄ Žœí‰ä·ˆÔ÷~¦N¸P‚¤ú¿êË2æD“w;7íxDQIãö¾:7%ÎéÔ~å»W|™Ïÿ~WóÿÍq÷æåîæúõ×ßí®^ÝëÇvÂ;þ¶w~³ãZÉÿˆ Ï|ûgL"F;d§.Œ£ÂËxí«·mX¯þâääù~qËÎùôòÕÝýa]ú»¦TÙ>ÿêúþñûþWÄbŸÞ}}ÿ.…ØñÅÙ¬ã«|‡kÄo÷×ßéT™•ûñ~®/;Õ1#3QØãK®|°…SÂѽ9–E£hoß1»™ç¾úåƒg÷·Ÿ}òùÀìéUáƒ?kÄ÷ôë§·‡Ë—_Ý\Þ?}öô×Oïwo/¿º|õôÓwPÖë×Oo®ÿÀÿžýáæð°G`|RiÙ-oq^”~ÈãCØþì“ÿÉ:Õ§¸ýDý«Û_ýÓiþ“©˜ü8þoo/ÿôÎä¬^óÇ þðpÙ•ªä·Œ|¦jäyÔ‹ObÂìÒ°Wžßv5‚ ¶å·³Ë>îF§Ze;<lõüñáã¾—kÞ^ÝÿÚ–¶òg½È|˜î«ûÃ8 ©¾<}ÑRžù/âÞ’BX2̯Wg䶇õ`Ӛ뛇Û-¼fÿãTÐí™0ñ~g=H`¶µlÛ7 ^ôyŸ¢©²»?ž½IXâ5 6Žè뜶ˆ]veÑö ×t—ñ·¼ ëßÞ,¹ÆÝÍ÷¦9rÛ5^ÏíãnšEŒU~ïûp{ýð²Ó"~EÖ»sþƒ„þ# ðgw‡Wïû«>™ì{vCQ¹$Ñ~ÐÔyœØáÖ\ý0ʳ§ØyŠ>j @f…€ñ­¦Èƒm(©ûÂÃ.lßS·+Ÿ¢tbï ¡¯m }?»$D–­^¤#;'ƒ­›‡5ðÐe ûØ-Èú`Râ[~É&¾Ì/±nWø4fØ^êº#pAntyùúe 9Æîœü†±Pö „:꯯}7†iµI\ø'Ï8ÆX6o{w/‰ùþò7÷3!Œþ?Ìt\ Í”,‘?¢ÐZÝþÕ'7Ww÷ׯžÜö«'¿-S…Èù« ¼~Ü6íºþëáËqÎNGHæqæÊÚ©ë«ëþòþžu=Y‹‘;Êš„6ñoÞ—ü†ÂïåO›´˜Zð{Úf7fW0OˆÌH㉚b'9t7·ßóÞ:Cfú¬Y²º¾C2Âs8Ô€ÿ<{pÏó-\a©}rÁwFÀ$þj¸áo1(_z‚ÌãùE‘Î#’ú ž:¬…]ˆ‡ÃKÞû¡ÓA„‘~ ⼯.™°¼ÔÁK”&£ ã|~÷åã·‡{ù“s”ÿÉÆ6mšsí{ÍÈÄ"uChs,2Ö=2€‹×çsöx Q‚XSÚyú/,ÓˆÙ9ÿh]ÊúùŸgoâ¶ÓÔêNÞ`ÅëÔrü¯gŸ U¡}’ªÌ{ªBG™Ë|ÒA~ Ù^ÝW,ºT…¾z||ó‹§O_Ý]ï/o÷w÷WOq%ÒŽôÔñ s|Kš+%ÿ%µ#¾( ØÛî—ñxŠ'ñ4ÅïžüêŒðendstream endobj 235 0 obj << /Filter /FlateDecode /Length 250 >> stream xœ]‘1nÃ0 EwŸB7°ì&R\’%Cƒ¢í‰ > stream xœ…U}P“Gß—„ä8¢Ä~ô}ÓñT@ jG=­×b‹¥¢ÈGA= á‰8‚ $yH B‘ [±RGÁ¯Ú:µtPçn†N¹~xí9Öa_ni{/§wsw\wwvfwžý=û<¿ß³K!¡¢(jÉžèXÕEþÖ°ØÌlµRQ¸°¹†[Aq+=¸ç@Œs“s'<ÁG>Âk+Åz?\¾§HðÞÅH@Q‰ÙªUAYanvN±|ãúõ/†…ñóVyZ™ü•py”"=O¥)ÊË•+ò3äQáÑáò½* ¿™+RåËÓ2sÊ,¹*KŸ™$Oˆ{56N»/!&.8ü¯õ¯5BÈWUPš™­<²aKÊŽ àõÅ ýèz íFÑh/òC¨1hòBK„ Qš¥®x  „«……Â)áOž»=»E"->ïû‹õ%Òº¸'unL ¸Rœ+ë~$"]#'KÉ’ƒ°K=ÂfS“ ²`aª*9Y£€ p¿stÈp†a®;/ö^y¿u®ÃżŽÜ.E}(h_n‚¼éÆ¡N<ãêtÿÑå7;‰íÓÒ î9m ­M-Îr÷±a ¿»;qTÕ_acß+Ôêªk¡ŒÖZJ»lmÍ ‰"HV !i3ÚßÛ{ŒýglkGO« è)f±`ž–ž”ÆH£´Á/Œµ5<Í~-êÃÃ6^ÔsZ^s”[9ä‡=? b›ÿ3¹q?‰¥Ÿ>çDSÍAv¾í?Å9 #pÆ0ªçs%H*ãAxýÅ]è<îôÃÂIœ½0¤us“<œ41 Áà¦q¼¾×áAZ*q”¤[“WDÀA…êÍÊ›é[àwp0±$™6|/’ºÈêû%ÿ·(¢ÄR3F÷Þ¿5v6ãU†”ÿŠñ¯š>åÜÜ ûC …5Sn—¿;O®³²Ü¸Øi02Ño¼JàÚ·áZ7=ogé*Ù<¥hÀô\äû èžJ¸??èãÁ¢¾pus2b?еèÚi•è0Éôt‰Ì]§Æ[¬–Æû`ãë;K´ŽYI¶@ì2-¤ À{-̨ðZ;¦¯ÞÅrØtš/ÞÎg^¸ó%x—†â¸n Å›I(ÙÜr³a– Ož'ö-„¥—ð¦KÔõ¹ß æÊð™] ǘùYÑ15¨K: …å~ÙÚ¡“%©ÂÎR8ÎÌÿ,ªÐ@‰Ú­,7+jµƒ}A7æADJKþ^®¡ÝàoÉ 4èL'-D†½2ðnÀ€_èÅ1øy¼Ül6š ¶Ôšk*7D*9´®è·@¼!¢‰ˆÆˆ×M"ùæ+Ж³å¿Áq%~›eð§J쑈1Xþy%ÐUúj]­Qg©ao$b²È «Ž’Cd5Y¡×ÕÕA-­3V7[gîbêsù¡ã1`Ÿg™R;çüœÔ»ÓØÆ¿þGðç2øD7óEê·;ûaì,J]—÷Zí6Ø QÆKÛG6ß+†`Ò5ôuï'_Àz“UѰ¥*¦„ˆ^®*äŸÓ[)ö¬º ÓüW0÷­c_}x¶.ÀM{øéxØ{h_µ‹8ƒóO7ÚEn¯oÆKŸê³|¼õF¾›ëë-7||\&ç)‹Éj6™}~ƒÐ?®ú—€endstream endobj 237 0 obj << /Filter /FlateDecode /Length 190 >> stream xœ]P»ƒ ìù þ@tLáИÆ"™L’@< A-ò÷9NM‘bwfÙÛ{P´ÝµónáÅ#ó‚…[ç‡sX“ÞÃè<++>8³ìŠØL:²¢½éøþDàXvÓw=Añ¬N’žÊ-dÂsÔ’ö#°FÕX«øáÏ:oÞî•'©B ³F–Š 2Jt$¹’ÜZPÖ(ë‹"œg]óØ|À±/7kJຒ®ÈË;¿ˆ!æG°/”h_©endstream endobj 238 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1182 >> stream xœm’oLwÇï(ÔSëŸklæî.sQ÷f6㢛“H¦h†L-S•¢Pj+ÅBÛ;DúZÚ§\ÿA¡-J¿¢ NÀqþÉæ¦™Û ³S—¸%Û2ó;<³í0{³do~/¾¿äy>Ïóyp,3Ãq|ÅGšºªuƒîè¦ì½Z³AcšûY#¼Š «2„×d r³áYg(d Èœ^•Ù· ™^AKС¥˜ Ç÷Ø-endstream endobj 239 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 287 >> stream xœcd`ab`dd÷ñõM,É®ÌMÊÏ)¶Ô JM/ÍI,I©üfü!ÃôC–¹»ûgÌ÷%¬Ý<ÌÝ<,¾Oúž"ø=‘ÿ{œ3#cxnµs~AeQfzF‰‚‘±®.´THªTpÒSðJLÎÎ//ÎÎTHÌKQðÒóÕSðË/ f*häç)$¥f$æ¤)ä§)„¤F(„»+¸ù‡kêawª(#/c`bddÑù¾†ï?³|Ã÷ÊmŒ@'÷‰.¬è®–ûs€­¶¬»¬t^÷lùØf.è^ Ï×8uó„ŸBË7-dÛÆµ[Ž‹9\Äž‡³›‡{IOoß´žÞ‰ú{§ðð,ïÞÓÛ;cÚ„I}=<¼ çl³endstream endobj 240 0 obj << /Filter /FlateDecode /Length 362 >> stream xœ]’=nƒ@…{NÁ XX{Ö–¬mœÆE¢(ÉøY" ¸ÈíóÞÃN‘â­ô–ùf<Åùòr‡5/Þ—©ýLkÞc·¤Ût_Ú”7é{³²Ê»¡]¤³½ÖsVœ_ëùëgN9^HýÆoõ5UUê§r»ÔN]ºÍu›–züNÙɹxêû˜¥±û÷ÈWÛ¦¼ZáUÆ9œÀCT€â1*À#±‰ °!vqKUVÄ> stream xœUyPWïf˜î–°(4íˆàÌJ‚\"ŒâÊ1‚#·Š‚@ˆÀrÊ¡¢âÝÄ㩸AŒA1Š1‰ j`#(ˆœ âaƉQÍ~=õÆÚílmí¿[Õõª¿÷úýúû}Çï# K ‚$I«ðŒÜ-%Ùé©fËw$y' ÞITŠó‡Œ…b~–5¬EÈÚ²ÎiÊ ;h·…ÝS!e!"Iÿà=nkãÖÍñðð )(,+ÊÎÌ*‘ûúÌSÈÓÊäœÈC3г3óå®ÂË–ŒÜ‚¼Œü’¨ì¼´ÒbùêÔüâÿ^üÿ ‚ç–¦n‹(KÏØ”™›7Ï×O1Üá"7¯9ÞïûD4CÄñD0‘@x‰D(±‚# IDvKØ1$1ƒp fSˆ3„aML%–¶Ä»B¬KáÚâgr6ÙDþbA[DY³øUä!º ê=³ ·Ì¶ì+Å[Ä*ˆ ¥ ©t2ý}†fDŒ=ãÊì€s6|Róq}Yj;6pHØo4|-gª…+4ÛýÏÍXÏ•ô)þ×/§uªW)ë€ò’ƒ=-Ü/ÑòžZò‚Út"ø’¿Àa7?gŠ•z˜nÞÀrPÍÿ {Ê*¹§x:ž8×;N ,°7µOdfÞ}@p¢ÝìÄ5„ínÇùÜ(œ¦šÖ¶÷"œô@ÂX&c}BQ\ÎÆHff=)¶¶Gp»c[üNÔb߸!˜ So=šïKPóÛÔvÝ#P9²¼_Ânã·LçkâVšm–¯V*V¦^º#åé…&7ZѽúW)ªE-gZî1Áûx-yEGGDü×-ÜžûÐLjÉßqì´ nÑOÂZ1Uº1SZ\øaÞuÌ(uønÃÙÄ<¸\ +¥f–í Ûƒ­v–íËÙµ97…1ž=Ñ¿÷´ÕµwJ?]{º¤GG>©?Ì`WãPÁÞíE%Ù¹i;£Ê8×vãB½á¨ìQuMeýQƆßÌtHh†S„§b/ Ûá8lqbO BpŽÄjñ3  $8Y)«d–Ó5{jöDgÐÙÏN~qúı“_\r£Í f²ÎéD|¼âö]ÛýÍÖ³™-gƒƒ}°%Æ98ƒí`?ØWÉü©rÿRC3wM?LIûÀÏš¦´àª‰œi!¼Z’¯‚]úèêÎÆì±%×çX®^X„ƒpÁÜÀz¤¨Z«dERf8ŠG)§ š¶~õׯ^g>éåwÞEÌO+½d6pNˆœëØGêGDpD «¦ÎŸ8Þxø:xBzÞV¹»b;b“ß_.óU†iLI#|’Î\8_¶f‚B•ž×Áy­„uâÝ„e4;~'5¹~¥#fý°^êW»ª9^Ö˜ÜZÔŽî æú¦¦Æòë\B7Õwí•. þæ® iÑÝ/¿½r©åX7‚©Œ§¢Ù\\Éé[ƒ°f×)æ'ôö­Æï‹&òþò]ÏèB¡OŸ€»ðû…¦ÚŠ}e̳ôw¥&>2*Õdï¨<…4û¿Ív÷ÿ§Ë Í„=ÿŸF¦ÙܸÕ{û|F¸¿5o˜Í[6®4›ü,úéÚës”©[b¥¹©§ÂÃú(QÒæ÷#˜ûô„†P­A5_Í™ªõÆÌX:‹¶îÄNeÌ*óc|‡ËEHÇ™¦PŸu}Ý k{Ù1ãÅk÷Ñ#ÔUܑژڰîx8š‡Â…Î.ÊØr@êP˧g«OÕ5ýýLb†ºbbÿœ‘)›»»-ø l/öuàs©I Ñkíx™a…AÂÞƒÍ0Æ¡.Rϯ¥(|Ö¬ñqOjùý#™U[•Q“sQy/k\P×§z˜õ8«uÁW2ö§ž3ß´öÍ„i‹û±#vY¶{í—ꩊ¦Ê/œT_n:u1ß'¬/Ëݸ]VüaÌy˜;HÂÀB8¢‡7ƒÎ|¶ŠÆý¦ bo®r¸ˆ‚"øQ<á)è`®Žä—ñ(4&p& *Þ4]üºÜòmMbžuªœgÇDz&5mœ®Ž­*¨Ý|ií¹C‚Ó./_ƒ;ȽŸc§„ô]yi²zHÃÕÉ @Ïl ¿{ øÇü×Üv°Z¦Á @ÊŒTUJè6?„%ÛÔ~·ª!æv® Tà8þ Þ‡yO1«\³9>CVa/^¡Ûè»ôÏ•Œ «K¸ŸÚ¢=|¢W.^yﱡë¶ÎÜO“óã…@¥ÆL#_Á³À­Ànñ¸œyJ5ÂÖG°ÍLº×x¶Ø]4¨ pPX$ì8ïÈÛr÷›ë. ^(Å  e¶~K±xE]V_²”ýmqZzÌ’™xÆø\ÁEù/aÆPzç¢ËRv3PÃõ_M KL Z¾¡Y£¹ÚÜ/cÃ7-õ]±þŠ˜8ŸùÑ£c7'çÀ$ ñÑ’ hx.jƒE\ ¶z  "MÕõ$lÊ´©w7vFž äÆÑÝ˱ƒÁ ìh=u£Yv‡¯vsE‘èƒKåìùRnøö oßèHÅ‚ø®ç?wö ±3&¨É¾‡"Ø-´á{XUÏCØ÷V½Äæå.‰°_ èÁYˆÑCHÐüePs¦ %_Aý!EOp÷$w@…`ßP½f ¥Ç.-x) „ýq€žúP Ѫ4"þœ‡Ó!]‰Óqº„E‚I™ñ5©{-‚Õ¯9—׿¡­$ßí8Óx?18„øX¨(\4ˆ Þ˜É­DÑy›“W•x <“Áû‡0žà>,HÕ—>Mê‘nj9Ž˜Ëgß»ãõ8-ÙcŽwÒKؾ&³)©ãkA\uÎçÔC«'ï ²¶©²þAügˆå•endstream endobj 242 0 obj << /Filter /FlateDecode /Length 212 >> stream xœ]=nÃ0 FwB70-7‰ZÒ%Cƒ íôC" Š3ôö!é$C‡GèI$ÀOÝáøy,yÑݹÍár‰ oó½Ô/¹¨Þè˜Ãò4©áêªê_®þþUÔÔ€iõ“»b÷m†A®úu(ÌoÕl®\PMvJÉ*,ñßÓ¸øôì4ÔÉP%­@:²î­@ºgõV õ¬Ñ®˜Þtd¨ªi»± ~Cê?¬w²ØkÞ‘Ó¾Âépo Ë"_"‘9i.øþµ:WžÒ„zîjÕendstream endobj 243 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 333 >> stream xœcd`ab`ddðñ NÌ+¶Ô JM/ÍI,‰©üfü!ÃôC–¹»ûÇ—Ÿ^¬Ý<ÌÝ<,¿¯úî/øÝ‡ÿ»§3#cxZ®s~AeQfzF‰‚‘±®.´THªTpÒSðJLÎÎ//ÎÎTHÌKQðÒóÕSðË/ f*häç)$¥f$æ¤)ä§)„¤F(„»+¸ù‡k꡹ Êe``` b`0f`bdd‰ú¾†ï?ÓÌÇ Ê¾Ÿ?ó}ò1¡7/¾w<ê~$.ÌñS@ìwÜ÷›¬Â_>.¿|ù®Ô§ß÷+Ëýžð×ëÅ÷óßMؾý>ÏZñ£_ÔËÏ÷7¿Üoõï“¿«³}ç8ì,ÏWºðGÀœï¡ ç.d;Ãõš[Ž‹%$$ž‡³›‡{Û쾞޾žžž S§òðïŸÚ××ÛÓÓÛ3±‡—}9‚Äendstream endobj 244 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 366 >> stream xœcd`ab`ddôñ ÊÏMÌ3Ó JM/ÍI, ªüfü!ÃôC–¹»ûǺŸº¬Ý<ÌÝ<,¾_ú$øÝŸÿ»3#cxz¾s~AeQfzF‰‚‘±®.´THªTpÒSðJLÎÎ//ÎÎTHÌKQðÒóÕSðË/ f*häç)$¥f$æ¤)ä§)„¤F(„»+¸ù‡kê¡; Æg```4b`f`bdd©ú¾†ï?S²C÷ÓïÏ¿3<ÙÄxù;Ã÷©˜¬ûî/šÆÖYÛèYÓÐÒjÕ]ÛÍñÛŸí»ÈçµËžœ^µRråÊ-ûº/q|üÍzå·ÔoQC3݈m­Ó–¬˜»~aÝêx¹EûNl¼ÐÍñå°­•KŒ“«·üïÆß¹]]Ý9’?ÜÙøÊüpžõ=êäl›¸îqËq±„äópvóp¯îéíéëéÔÓ;ù8φÞÍý=ý“zú§ôNåáe`ñ†®endstream endobj 245 0 obj << /Filter /FlateDecode /Length 161 >> stream xœ]O1ƒ0 Üó ÿ ‰Jˆ…. ­ª¶Žƒ2àD! ý}I€ÎÒùîä³ì‡ëÀ.|D/J`›H‹_#Œ49µã0¬Lœu²¿éðþ‚Í@vçw=“|*u)«z¡7´5O$ÚªêZk;Alþ¤#0ÚÃÙ4]ª”*þSÉÑ\â¼ ¸ÆHœJÓÒ$pL¿g‚9Ä5ASAendstream endobj 246 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 283 >> stream xœcd`ab`ddòñ ÊÏMÌ34Ð JM/ÍI,‰ªüfü!ÃôC–¹»ûÇÊܬÝ<ÌÝ<,¿7 }üÄÿÝ_€™‘1<£Ð9¿ ²(3=£DÁÈÀÀXWHZ*$U*8é)x%&gç—gg*$æ¥(xéùê)øå—34òó’R3sÒòÓBR#Bƒ]ƒ‚܃üC‚5õ0\````ì``(a`bddÑü¾†ï?3çq†Gß·0~ïü¾…ùÇÊïÕ¢·¼ÎØØxyÙØœñºuëÌ™[r|¥ 8Ïùž7mâB¶U\¸å¸XBBây8»y¸öôöôööLêíí;ÁódKßÄÞ‰}}}&öóð201«g>endstream endobj 247 0 obj << /Type /XRef /Length 264 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 248 /ID [<60f95272b462929c0fc334629e110fc5>] >> stream xœcb&F~0ù‰ $À8JŽ’Pò?ƒ¨Î ›Í ”Bž~M!£$"mhI®²Å6R…Ð/ÉôD \³•A$Ëv0¹D2Ÿ‘r%`ÙZÉ "@$ç!°ø<Éã fgH±É`5³ÁäÉúLž‹è€Hv0›l×3°^°^0[H2 Zu}›¬’ìªÍ`5Ò ’ ,Ë4DÊ$‚Í\"ùLA¤:˜myDòo™i±¬ ì6¦ï`ò*Ø_ÛÀìR°ù`1¾“`õLo@¤(8TRÀâ`ÿr˜€Ùì?2V‚Õƒ]È q,Xd9˜> stream xœÝ\mwÛ6–þ¾¿ß&=ÓÄ;Ù3ÓY;‰›LâD‘—f6g#Ó'²äJT“ô÷îÙç$E‰”L9nÚÝCÓ$@¸¸ï÷”`“ÌX¦˜ŠÓL+™Ibf™ÕšÅ,Ž K‹ŒËˆ3Ž¿$Œ &d¢PÉ„±1㊉D¢¬™´èˆ¦$½„þm„ö1Óó„in5Ó2áLp¦u3!˜ŽQ)ƒÀ°B1c4žkfi|a˜•M¶8Ás@§d‚AYl“„Ɉ%‘”Lr–(* –ÄxŽ*I3‚-J¨Fc JƒaQƒéñE‰yPÐ —˜0ƒÎæ-,þ+š{'Œ&)9Õ$!=K‹(ô¬"£1uÜOL†$àVèYaÆÀnld€ÜÄZ2žu„±pÏ5ê@ܼjp­4p‡žµ¡·Ð³¶h€®¸ŽA<å&I z#fгQàg`¨%ÂÄ •AÏ&Ýð”[Žþ z¶XÂD¸UV0ƒž­Æ»=[x,ÑÓ¢[‹žm‚6–( l‚8¸èÄ¢çXN™Ç ´è9ÑÿãocáiV¤i‘2kÁC¾XÓ|–-Áz®åÅ„M0Òb‘]²ëtô  ÙÓì˧ùâb‰‘'ÃïÙч¼X¤‹/l°ÈFù}ÏNWÓ"¿žfë:v2ŠÙøþ`žÏŠïÙ]Î/nj°˜_¬F úiðŒý4™/‹åh‘_, ´"49[}øw6*Ø=ÜŸçF½w´ð@åÓ/ìh4Z-h”ó«ëUáPá'7ü/©óIƆW×— 6¨¦X"ôÁ|5+H‚ç9¦û/è¾ô—ØÿçîÂ!¿®(}QxBÅžxqRÖúw îš”ï*ßÊ7z_Q×¼¢íl6/©ªVæ³"›¡’k?(xè"OçŸÑ,¡8uÀðžz\à…Š‡†Ùr¾ZŒ0 p‚ÞXRòp>:Ë ôž ìs~ü± Û&–,ºÈKºq];ίÒ÷çÓ >šæÐ)¤K]÷ŽELÒZ72xË© è5ÎלãÚÀ”9íQ¸‘i|0ãùüÕ,G·Y”&ÿzHÞäÅÄáWswF;ŽDƵ µª|"a÷%Ì]VA]gÕ¾ÙWìø4.kmdᘔSFtðÈXÿÐP~CžC,v‚­a›© ,®¿0å•=¢Mw4Iת|Jõ ¼¦ð†*ŸU j§þÿ„±÷µø-G$¤}¾~œåãIUËëß ÂáIøSø$< á0< ÏÃ4L/òl‘-óeø!…£ùt>Ãÿ««4¼³ð2¼¼ÌÃËüWÜB¸Âq8 aœ'Ù,ÌÃá4¼ gá<œÏ²ð:¼&qœf—…¿[! y>¿ YÍ‹ìâÃÔ5¨ ¾Í"\†ËìWtºÌ?‡EXLYŸæá*ü~ùÎéj7Ãû¼žLÓ1y%N8Ž+ážÁ˜k7ñ÷þéI>ÍÈ+•U=O¯²²ýÎM>:𡽽Ó|¹„¤;ñcäÅ…gEvõÚY¿†€6Ľ¥D?Ÿ<>:ªz˜]å<º?ÌÆ«)tÁZ—@ÄgG³e¾®XkÓ¡UJë[k_¿­UºTˆå»Õ‡?¬éǃ r.ÉýÖunl,KÕâT™‚¾£à¤Å­Ñ·¸- n=‡ÿ“]lðATó‚‹mFÀÃXFn„->ˆ·ù`?yú²<¯nvß–ÓC˜ÑæáÉÃóÁËš »øÂ ÖÃÆè-npöÚ˜Òƒéd 7”­”5—GQ“îDW:+:Ígnð€„‰–q².£-]}‡}Njíß°¶2j$ÙpÖD;ð >1 ¥lì¥^ÏÛdn}{ ¬œÇl¥‡Û½­}oP±»¡—Šz@ ^!ÓR]+–§²›•E\³¾COù\;æNU@W:©Ï?ÚœÜý±V Î,÷œ#áçP³v Ãö0|äŒÛc˜·g0pÏõ‘{¾ß„oÃw[æîáWV8ƒTÞ{{Ô¶ƒY:Z¸Œ)L¡ƒ#Ì®.Òå$ÌfþòË*†ÙçÑ4½ªÍfi9§Æóßµùœ!<9Іî3¦®Ô´«W¹ŸÍ. »ªQò+¬íçðKø[ø[¶˜ošÝ¨ÛìÞW‘ ‘tÞ2h(ÜÝ:¯·íå}mï«£Á»—cm9ðûŒ®ŠÚj¶fzU,¢½j¶ |v¨YxptvÜs:×5²v®ý›uÙ /ZJšº.ièk#Öc-p‰k¡¡üÜUØ*UãÒ5ñt-JÈ4¾ÒÊÍ¡ÃD7z¥”ÒÜ߈ìsjÚð@ïYÉL^û™ÒA\^qô*ü¼Á¶­w{ x˜È.oÑT6·fڌԗc‰—ná<=9zúè £ž¥³åÁ^c,Ú ÜÈbÔmz9Fµõ²MÛ ¬jvØ D­< ô{¼Ep £qâä6vâ£'ⸯâxýèüÅË×[ôö£ôľm«± è}+6Õl~Çô ÖI›8ÎÞå]Ÿø°)+Üî#=æœÒر٦“Ú¦Ó^ìõ•k{GXoOÞõeJ¾ßëD‹VH‚íÕîzŸvO"wvê\Cë+]‰š†Æ‡&u+%Q—…¨Z4˴ЃÿÜ[ç×>9eb ˜(NlÙÎxÏZ$zË×w Ûàò+f}O£Wå A1­-ÑüP¯]¤©àꪈP+ý[ÆPÆgÜáîñ ÎõÅVãiéæ­¼tW#'lÃùªíIíZíON0,¥s´„êZf6.‘ ·ÈcwKfªÌá:ÝÅÄMy¹OË»ý¢›­ŒmñyóòÙÙËwù4-&~´îH”·„ˆ·…h;¥¼½Bd÷‘QžýâÒÁi‹Œ¶ûÄt²ïÍGjR¨¨£ös³!>˜ìwh‘”W—qkmRiW‹ˆ3¡YŒªâÊåS×*”¥9 W§ŒŒN "ˆx¦×“´!ãpœÒ½ÏßM³åÒ‹‚„ëI^ç7L)ª)Àò i¯h Œ,<ô¯ª•{¹óúZ .úZŠçoކgä@œÎgón&¯ŒYÍäRµ™¼¨ýL¾/Ý¢)ƒÝ8=»è;;£Þ=WÏwµk×Fwº[á×Íñ&~Gâ +ið3 Ïr”ç£|1Z]ážâêåÇ0-(y.ú'.æS°YXg\®àr_^ÝÉe˜­®>d‹e>¾9ÙN¯…yºZ¶²îÍŒ{%ëYÙFÍÙ¾´€¨ã+³•ðÉÞ·={§³74ÁNÁì€Õ·²}¯_Ÿ †74PÜ¥ô¶V ñ¶µÂvpÕè´süvvë÷;´éÊ×iíí Qëä„JàÆUk kvXœ˜‚ßgÞæ›Ñ;ßme8ekEkUNÊ:ÙKâžü•ôN9½Ÿ=<ݛү aÍMíXQnÇŠ7¥šªu‚nþz‹’”>”'ÖYq¬Sü¶ñ¤OjÝ—µûà6ä7Íýz¤õÂT•›\f¾Áݢͻû=¬Ÿœ'õ,ÀkòSůÓÁ MïÃýzœ÷¢™±­5óçþ¹ÙÒ£uð¶7f[Ù•ÝœÛ[ ÷–’çƒóÁË—¥¾?›¦³âàôV‡_&Û¼Ù/4[…¾‘_¶Ë·Šö´êöËöù\k¦¾Ý,îÖ½­wö¨Ü±°ë¿nùf¸/òéE¶vÓÈG}ô¾Må­eµ¯V.‘Ü¥ 7¦ŒÙb·+w7^Ü®U./®—ë–tå.%Œ:-¬ÞVû…y3±O}È]éÙ.îÈíò:cá«á“êµ#·ÏÎWÝ›Åõò‡0ü°/ƒáýëÅœ¶kóŘª~ËAN.'óOÿb0çÿÈ/þÎÜ™ïÜÆ°ãùp™¡vÚó+pïi·Ùˆö“I™œRa‘’HŠ ”Š›€Âà÷ ýó,Ÿ}¬A¥ së=‰ÕηjGÙWï|S_·óíéÏÿ|ñ¨^¤»‚Öq[AoÎÝ{Ẵñ¶óá—ì»Ý˜„û|ä:Q³ÏÝi.ñGåÿæò¾w º÷+¢ZدÆÑb¿SóõÐn?Í¡ÙZZiصÓ,+ø>6R² —nÝÞ÷™ Љ˜$²#Ïj[û¾nàìÞ+z½—’žŽž®­^|˜æ¿¬²Û/âÉ?ç"žåq—µh%ývâ£/ê£Þ C§¯^ ž¼ØÚÛõÕøW­ÐŒweÿ:×ñzn¬‹\üÒ,··Ô¶n_Åm£Û°‰ØËã÷!Iîq,ãŽmtÕø5U÷£ú³8PûímoNŽOßíMëVÑÎ:|HڄݨM/ºvº·´ðÑtoE“Λ#$L³ Xò.1Ûæüšõ³IŒê„Æn…]øèI¨‰ÞÙŽáÙËã2¹òè3¼úꦛÑ6 ÚYµ½z”ôÍ )xJÙµ0æ69Þ:²8ÎÇãuéC>n„ëg®H—+Ä;äFW½ÖÔí†INt²‹WýCxôäoók+Ew3õd\Ý`–‡’¾ôãékÄʃ¦¯KS5„‚UèQµw SÝ[&êöîƒG—_VïÒê}ÕžVÌ«ö†Öë{Eß0–÷䃺ûvžúùù?_>¿1_R-¦îUsI|7j®O†ø‹>rsQ×Aa• ýeR´„ª …WÀ›Ò(‹~aÕî¡\¡üþ«4eôý—–í´Q< $b¹ê °&#¤Kx àúˆô„)Ž‚(RôíM`àëŠ$hŸ’"Ð6ùC@’ˆ„¥Ö5LR B&Öþ0IÑØ4E& Ï!¥Œ£­1 H\càF×0™$P@ÏA0õ•ÁñÕõ4ÿp°*nƒ„¾ÄJ<éjމUü;£M¨À@õn¡G" ½DÖcIrúz<áA"{¦[î$)¸ã®&¥‚˜¾¼?¦¡p_õ—Æh—‘ÒŒW¥i°èËûêÝ ãÕ0X» “åLÙ¦ÑéX»˜çŽ£J£b:ºrUÐ Št( ÄLtIÔ!œÇ•…T@B¡<è‡TÄúÚY)ÐÜ©tÜ)äJj0¨®!_[‰?;äIä„]qÄpi„4ADþ›°(À9FTFþºÐPPLInØ\% Ü,iã€"ç;…ýVŠl  ³Rb¶–~}# Ÿ¤J´ÑùÏ ít)%pD¢„)´ç?°Ö}áŽî©îo„ñ*ͧÅü‡«4s?ñŸË"-“ +&¿£ÉAj jú uA9Ú( Ÿý0÷®.‘êà,A ¯³ùõ4 «Ir¬B¿ñ@Ð_úÓï’ÀÄð¤§Õÿ*[q¨}è\Êž4ÚÃüò2CpI+ÿraÆVÚcý»õK·éñŸ[‰gˆþ“üŽz¥Lvs_0ÛÜLñ_x™ãœÞÝ4šq:ÛŒÌ]Šn#ªg[‘<ýÅf¸îÒ—Í´€ûb;ÄwY–­dÂ]ᡤۀJ,û§¯´£Ôí¡ºÎ)v¦m§n½È/y2¿êJ¿áW5¿E1žÿœ•_÷5‰Lßô­™Ø¿q7pý~’‘T3vÓ½›>K²}’sÞ;Gû_é¤endstream endobj 77 0 obj << /Subtype /XML /Type /Metadata /Length 1531 >> stream GPL Ghostscript 9.55.0 MPFR, Abitrary Precision, Multiple Precision Floating-Point, R 2021-10-27T08:53:26+02:00 2021-10-27T08:53:26+02:00 LaTeX with hyperref package Arbitrarily Accurate Computation with R�The Rmpfr PackageMartin Mächler endstream endobj 78 0 obj << /Type /ObjStm /Length 3432 /Filter /FlateDecode /N 74 /First 658 >> stream xœÍ[{sÛ¸ÿ¿Ÿ3Î%s I¼ÉÌõfüˆ_lŸ#;¾Üõ2=Z¦-6©#¥$î§ï.øŸ6e+mGC‰ ìâ·‹ÝÅÒqˆëêÀ%LzÄeDpF\N¤äÄDyðNÂk()â (ih 5q]BÄõåÐ*RáAJ¨Â2#Ô…¾ {f@d !à°=…¯`@Rƒe€$eˆ,™X(>q <õ<OÌH€„ØÁpAÐ…Ñ!VÇ@9p‰4ÇGaZ ¯ÊÔ3ÌR¬‡,9úâH˜a;ÔÐ+"É”ƒwȱËðŽ#­Àöñi;Ø{(|´Ãz†¶‡oQI4r QMäHb]œŠŒó¿üð±÷ƒlIþA\ÐÍ ±?üú(Ÿå ,-º¯¢ˆ|$ö™Ÿñ’è¼ÚE¸Œòìb ¾ ã€\³0¾~ENÎ&įÉáÉÙsòã†Æ^²‚¶/ù 5¦¤åÁ,(©„)ÔƒÙaªûXyá4øºÄIa Wª(¥Áç‡;i¸œÍƒe8%_àŽÌ7éËx5¿ Ò¬bo'Ž“el!:ص1ÿ͉~Ä!ÄK •Á$+¸: ®C7ù íøHOZ ˜LÑ5byOö$È’U: 2‚ 7£ÏßÉô<@\ì³ýà‡ø¸ƒÛ»E€]Ý%³%‚´ ¡p-p)!Ìq œ\§Ή¿œsÀñ#Ì–>Œð9 _[>÷_˪ ±B€o ÆŸ€o«¬d–T^ Ù‹€Q•R’Yðç ¨ÇïÏ~Nn’”@yÄÀð«ç‘šƒþvfK“šhP›Àœ¸ãÛ$Å»’ò âg§«y†SÃH°œ¾êØšÔD Z8([R·EàNÖ–BþñÇN}÷™×ófO—!h'@“^…ËÔOÃèŽ,Ò`fAG4m–À6[ŒË&Kž3ÌRÛ€tH"{ @휟¦þ]Ö'"¹5éGˆ¨°¹tŒ×±ÜrÀ%7®W7ºe!ƒæ6@;_P º~9öØ]‘ÓAŸ—ÿŠ»«¶…§Wy¯mw5ÖÔ÷šš½³XD€BsüC]*éZžp[*+ÑoÑ:ÄnSC‹ÌÂÛÙZs£»í6i³"¦ÖhÔxƒh­2 Võ½ëgAÚ¾x3Ù»<þþøäÜ3ê¼ÜM¢kb¿Ž§ š>bÿÆ;q®Ü›ù)g#.`tš†‹%dO­U³ªs¾ºZa¡Èh)¹œü/áõr† ¦!‚ýX©]65cDí=ñ&ŒÊ"ôŠñÌž<7™šôù·F*7ï|w­ "Zlý1sFY¥ÁG§þ<ãhéƒfìÄ·&: ³ 0œƒí‚'çË`~‰a{mh5PŠAM® g&ìÏï1|eå=ðUÎ WUymÝòÖe?–²²-LMV¶… Tº „Ÿ¬l a'/ÛB¸Éó¶-Ø¡Ç:ì¦XÁþç*Y@XËŒö At `‚ý´à¶pyzñÓ»SÀI'ç; …Ip»Š@—Æ B9÷ b­ü.O~ÛAr`ÏïæWI”¹kz•ÒcdžsZ)¿Óé—gMåÇEÔ8íw°žö…z•oûqÁå¶g¹¤Yž+uç|IñÆ7a.ïìy¯2;õ¯ÑkÕð¥'åšw "n´ôÐkëáŠ1Rqi7RO/öûéW 8Iæ~ܧƒ÷Ybѧµ(ÁTR´G“÷qý„V.ªO?,»mꎻU¿œâ»!oÐë¶¼5¢²–w^¬ä ½Ù7áçÀNâÀ^ w‹‚›e~—+Âr–½ü’ØÿÒ¤®LÞë Ì{­”!ÚÔÒůu`P$c¥Š\–èõ†ØeV¢š“TõÌIÝ6¦ìõU™€í]_ˆ„û¸8DL¸IËJ“:Âï¾Ë©j4£ô|zh“ WPruô­ÃØüÞóäÅЂ>„ÔÕ/Ϲ‚+Fˆ¿.Dõø¬l9"†{Øp9ÅøÚx=‡£„ÖökÇÞ·ìCûØ>±Ïlß¾O3Mæsß¾s“¯.o’UjÏìÙÝbÄvhGöÜŽí8Û—äKÏ<ÕUée!ÒS;³³ð«E~6³ëKÒ•ýÕ¾X“v½¼sA3z¢ðNNbPudžß|h=ºög ûe¶´Ê?Ös—ƒùÊZŽòñ¹H¸wÁÒ÷ Wgå=êGy/ˆ(ëÃz^”´\s\¢¸×æ¤DQðÌ!‰¼à™e›£EAšSEA›µ iµ×ÁÊdßöŽŠž6Ú똄ð Ø5PqòêúÐkYÓ³·o&eXÕ·"Ø4WÅښב‘)•æÚN&`“Þòze‹zËuí·ÍšøýОm¬kNìS°gÓÂŽ…Æd%`©zÓd+µ¯9k£—´ˆ­™èn•0§“T‚±ËP÷ac䬥ÆÁö£M ЖŒÎq銭FaÙÝxw©a@6n<@Oâ·ö"彆éÖxßÌÓu6îy÷€s¶v<ˆWûÎèdÍ•LÎ.ß~ÿ&ˆ>ã 0¿‘U*F}¿ë(ñ«Åá}‹ã*ger¼×›p&^…õvE‘Ætßu¿‡hæ±7ÏdK§lUf¦cZk~Ë6hm}-Z6Åʧ¼†8yÚŠ‹Ã"Û<¸“§¡ÁÁ¬߯ÝÝʆ#_<`J¹a¦åk:™·®–Üëdе[ò£s—ç{g§ëTÑf1ìSÌNLÓ«˜ÃÙ¶c—Gµ×¶/·×>&ÐŒTŽA‡ŒVôe‘zS{°ôzN 0§“×ÖØØãá…xÍŽŽ¼Þ¿Ø?yûýÉùî f”GiX€®f´·çÔØ`W³ž¥°Óób%†½FÜ»ws^+ð*ØCKD^ ŠûpGƒT®@’ßOË4%Ñ]”Üúæ@ñ_÷Ãê~“t“§1ÓÇ”°„ã‚Çq- Ó Ê#óe<ˆçÔs¯‰w”—Ñ„9¬ÎË…èà*î[>.™»ÇóžšQEAi Çÿ UŸŸ]\<6ßk̽֔Ý(¿Yöýé™wæt’GƒüW3ïøo ̯̩w 3Nƒ×‘测GÚ-*o2ØZ‰$Vk^â>ªÙñÍÃø'&©:©¨±¶ro²sjM^.Òä_€¬±– ú &Îßwƒ, ¢M¬£‘ nTƒð´Àÿ/¹ |†g῎ÆeãIÕu¥vîUrPM„ô,궦Æ-¢‘µ\—€ê •Šÿ'> stream xœ¥[[oÜÆ~W_š‡¼õAH2[xYÎ} œ N/Ië8* ÔÊÃZZˬ)­²¤,ëÿö‡ô\f¸3$Wv†¸ä\Ïå;ß93ùé´®äiÿÅ¿×'õéÕÉO'’ÞžÆ?×§_žüñ…ò§ÒWJZszöú„»ÈS©dU7òÔã_¯OÏ®O^Ч«ºªµñÆx±Õû;íVkímU›¾khmœwûͰÅO¦jB#¾Ú]ßÞ ›¡ÝÝÄöRŠûvx³úñìo¸Š&_…6ºÒrvy"^¬Îþ;_§‚å5*6ù›¬•uUÓèÓ5¬¹‘¾œ½Ùrw-‹ šÊ*ͽ_Š×´1)›Æˆ[|¶V×¾¯³ç}Zi±˜²v!¤‘ž¯t kPZl.VÖX+ñvµ®QBÕбö¥Õ“4•7^ù¤l¶ÝHåPÝʃ6•oQÇ4“‡¹LœIfãh_9Õøƒùå#½Îž3ef½Á¬”M7]·[©þ¤¬¸ïI‰bØá_°.°ç»l¼~•l=XÓ«ìKæÌØ/¸bwû\tâ‚ >-ZÖnƒB¨-¼Îg½¦õÕÞ‰W«5IÉÉB°O‰ d}²Â ÀÖ³•ÜÁñÒl.ãB;–ØQµ‚ñ©Q+|׺}øó> ÁˆËl »|O¹ìº|i¸‚5`då {¸œÛË’DÙ^@¢’ @²±(Ò€ì®H{üàÐ.P’ð ¨q½a%„?¬Ä%Á¦Ð;q´JºÈç܆œ¯7"¦Ï¸:„µüýeܸ3…#Ü¡Ô|Þ¸˜|:Aµ(…‘‚F€î¬¼Ã7åsô^å|‚8vŠB¢ïA è-¯Qr\¯5 ‰düü87 b´ßeòuG«çFWqtØÃYCŠ[K˜£X´²fA#ݦï‹iqÓ`œ&ÑoøÙ‚´î ±¢0 <½Áì¦ùuvhŸì\Ó8»jP²A‡˜a·ïŸ@k‡Ê²`ÁƤõ¥åD¬ÜÍþèl›ý~3.ûaHëÞi6ŽWPzë.·Ì¸°¢ãý›cÊÆþÊ4 ?‰€§„¨ ˜;ä½®·¥I_DáY5ÝÎøŒ¦0ÂÌ·'gx‰:÷ð[[˜È–£-à7 ïë™ûò NÇX5÷jm1ìˆ{–°ií߯ jð¡v“~Ø™¼é=àÒ¹øæÿ:_á M½¾{ž5|ö"­W|•ž”èÚWYˆe«€ÌÖø[¡çúhˆÆò&MÇ­²éÚ´½€€‘wÞ±w×䜨†\š»=hÒ2þmÂÝ&Ç]ÀU)P;Â]““`s.¸‘4Üu9¼¶·]¡ð… TSi5Îð|aäˆ-Ù¯`¯µô ÆÃ'àÛ₃ÓÂðÚ!:Ä *ž-¯ŒiÆÈÑeúÚ­,Òf€°Î›«õsv¾àÀ½wíͰ4!æ&í¨Šù€P;%ešo› ¬Ý¼Ê>,ñ,€³ ÝH >YI(Z`d(‰$if™Ê"Äè‚ϲa€)ÖíQ+ÔJMœá3 ã œ/€f TnjC¾ÈQŒ€0ä%91‚@ª%´„ØÖv›)[¡Éœå°jƒ³â¸LiÅUÛʃŒJv3L|‹PØ6âÛorwú6â8¸AWâPΙ‹åô³†šd<x˜¸lÙ¥{¿™¨ $¾àpyPk»ámˆŠá³•3À¢-BÀ+(ûL±±`Z MJ|—Ï×ûN„í <åæµHùG¢ŒqUpÓŒ¸¸™à `¸@ÂóUEß$ ˜O+ÕÿU Œ@¥~º+À)ûqv:tˆØÖ$#âS‘q`VBî^æ}‘!\­2-Y›Ê8ù 3-˜SÝÔ{\›…ABë‚æÚ–êØÜÄë‰ Oöνšôî:þRCÌy Òjš I¬þ¹_&î€-Þ>ÂÜ¡AÚ<Øçl”m®äa\¼ÁY hÚáˆú7,2¶}ôö”À{4“ýé<ŠC Bf¢B®E{¢Š €L¸ÎQmú«èlD ƒ/u‹ù)¯Â0Ïd } KÂLFCbN~@Fý vxØ ‰,Ðk\dåÌ8iÑ!¡HTiäý¬ìnH›ƒ¬ì¾M½Ðí6E2·["‘| lk°-Z2¬K;FAÚ¨Å-!óµV,dNçéW¡ëÝ>•-@R%ó*Èè]dCPƒ®§¹™ÜfJ#±Ãj,Êf‚UJ΢!5tÍbÍâ׌´Bl&Ò¦äÕkð$å}ht{4%î2´ƒ(|9]SÝÒj{¢'°w1L •; ½Æçšô/ËΓ ›„£*@&·#ÞuÝî*6Q"«à,@ѱd%À¦¢€ž>–#­—•Ÿ ¦í!³œ³6F?£Ù©?X÷ˆf6þjœ!Yòª®€VzDDØ4s0š÷\Dä7®ÃxÒEàÿÍr«nüHì×ç«~˜qBšcb)G’’Ž©7ð2çìñéž-³ö¢ÎR”£üs3*r¿Ý±ZS·é«X ñueýDáÅAj„›€0=µÖ[;Ùjª?3Ç.¢Ò„}xÐ ˆô1ö©Ý‘:¯õÈ]òy7}ÜC8 œO{ýNëÁ¹Ü¹&íÔ!e>Z‰¦˜Wï`L>å\âÅúͶ»]0Hm+c딼…söVœ(¬¦ëq¤Ëí;ÈàæCL‹íÒi 7Rc‰ ðGC¨™C¹‰S–vyõ&kµŽÙOc*?ˆñ± ÿ±a©h‡ÁÂX:%úù€‰²R,-- -ÁºrTÈ¡ gœ³œò‡~—šêHª´üT&Ô©Áò-æ–@?ö»ëøXÁî¨ÿPH£VRôyM3ßp,éå­Ï¹­Vu=ž…GŽyTëfȹnÖRØÇsØÂ»Y8¤3 Snà=ØrJ’óô`ð¨D>~Ìdñ°îWñôL›];Œ¬ëk5 ´d3ñ0/Q¿ÿðÆ€W!¸ßرÀ£Óá"à7îŸ_›¥ÓC ° k}Š®´£ÓÃç/~/i$.ŒäT¼LœÒ¨Oœ\1j5Vž²ãÖµ®kj¹V¶òM¼á¿¯ pmîYä±#ö`ªÓ/Û‚;˜ÑV^Š/Xe1+7AAv Gó¦ÐPʼn´ñ•‚ ¥eS)ëøJ„ÖfAÙ±àÃÿ †=‚±_%.ï.†¬hZ(x-£A×Jc¼óű5k8 Ðc~D' ˜/£!ý;êÛá.ë”ñN’牜0äïw‰²¶8yÃ]H>5Äg­'Zì‹_›ÈêCò ¢Ô\\)°ÃHX2¾Bà )‰v“ê|éTYÔ…¼.:ïÛ†7]ì‡NÝÕîPã¾}\Í!õ n»}Ú½/…”ÿX%~×ò <ÄxÜpª™.Zph)”˜¥Ï T Q|ù:Ób¾á›ì}ÑyAÓš¸*<ǃ®Ài©¥3§an\2kÆÔ"¿8BV<ÖŒžñ]Z2g¼ÃR×cëõefZy.A Í7KK¸B;Ce­xˆ|›…¾‡9d¡ÉÈɽ/MfËrª ˜úÄcù”G>#ŽgåÖ2åÔs`Ø«ÂÄù•ñb˜š<Ž ¸6²zç2tî‰U>=YYRÖáök6*K9=7Ü—㶤Âk œáu'âퟒ2ë+¯2ëèÒpV¾S¢‰Å%8`ÜçÀsÃ… ¥•&†97ìa†U) Ù,0d Fî‘Û©“ÕXªÍÈGÞ¤ÌÚ´RØÛyªM8 A¥ª9ÊX<¯¯ç2†*ײ0Eº+ “ÀÐè é8g xÅ Æ)˜+eKö™âîX4âëX¹Ç,XåûJú “#›1¯!3-´ú~s=(š: iSy“n”`îx—ê>†¨†0CÄ€m‚ž{S]Ê—¼¾ïÝÄg  ùݵ»£ëÜÞ¯–`MA\*–o—Ì<7dXwŒ˜2LtFû³Jäà¶éÇÇ›¸nm Û ÅE;Ž)¬Šnwµ™E-ZC³ˆ(,#®Úwl•.ˆ‰øH{©]Ù†è?'¹T,³3Ä ý)9˜N‚0+«J¡B‚ Ëñu’©Ð¹Nhø†æûØ®)‰j¬†$;kùRü ”KL¥©æÐ’×ȲÁ•Lº5·<'1mR• vÁ(L¥ò#ò˜C=Ĉ„ˆ¾ºXAg§× Ðx°Pøöð:÷‰]\¸ÍkHkð^ÚUØÊâÍ+®%ýx'E)%¶ïoÏ…„/d€«‚ˆÆ›!/åØKªò2¨ ™©ª«@‰ w¼ÏIC¯KyƒX†·#î)M¸-Û$‡ÀÓr6²Øb»>Ýi„§ö© ȬòªR é ª@ufˉy™QȘ5LBô>Ï‘6ýA~¹À¤M†sµþy‹áê\|vIKùlÙP¤T•sf 6qÉÈ,=¥ ’BÁÙ*P-XcmŸ×.'q>÷Ð¥Èg1y4ð!ƒÉ.^|ž­¥Í¢[1ë¾À©ŽQXIºp–£ÂXÒ"n[üȉÁ¡ôEX3&¦æ(ãE{¡(eÝãžVšYŠë‡3¦ÂÈ2AŽ6º|î`·`AÃùègOÒq­‘Z(z RHÿ‹ÿÛí”ãšÿnsF?–¡ó¯ÞÌNÁYâ¹-_Ç„YnMu¨¬¼ ƒ@'ãE"Etºÿ ‚áCÑ2ÕÏAfê£×h[0“×yµ! ëŧÔ>Ò7#K’vK{ͱltßrjFßikA\]†´n3Yâ¿ñÈ2zVáeüR'㦜¨¬¼ô¼·MA£w±@ít¥‘ç–wýrÎ.AIѽO–(˜¤$mž–^2„M²}Y¢âh„ï¶|çˈ‹awÄîÀ‰ñ&ìAGøN‡#%+5qj>BÁ-·}Z´>®š¼µ´PÔ6Óã*oæ—1Ž¡2ÿ,T³úþäÿ\­‡Xendstream endobj 154 0 obj << /Filter /FlateDecode /Length 3374 >> stream xœ½ZYoÇ~ç“ý„ýàÞ˜;êûàql) ÄXVè—ˆ<ä.—cíAÏ %óÿæ!ù©êc¦{wV†M' íöQU]õÕÑÕûã)­Ø)Å¿ñÿëÍ =]üxÂüèiüïzsúåÅÉ“WÊÂHå¨c§7'a ;åZVTªS£Lå„:½Øœ¼&çuÛ7ÛÙ\ƒšœÿëzÆu夓ävF+ª„aÔ‘õ¾8®¤½¹ø°"gѬRÀêbqBÄìâXì\å4׸b.…ªŒ9ÃVk¿® põ\U\PjOçŒ!%† ^“×\¼™Í¹æª¢œh+µŠ&|¶\R ³Œ‚¨Œ0Í9Œn9§Î9j9L£´É'@¢êMØF„’ #ãLQaœÚÂ쯜#F[£œeÊ á`^H`éI:è0e$®e ,ÅœLkã(ÕÚJKÇyîTQfàZ;Æ9Îò¹Q>—ÑUœYiŒÓLãNé ž{œ·ÔÁ¸ÒJ°°õèéNé4Wz¦—aø³£¦0þ´pJ,gE`”+"ðó ãeçÔ(âOÏ5¬g 4*`•¥<úr6—Ö€% ¹^Ïæ? ³¤îºe&c¤Þ.ð àÔJ²Yö·;@0¯(Ž,º§a§eVÛ)¤t“& ¸f0G¸²ŠÔëõnÆ‘ë=2çà?Ô6~Ø Iîsé›»ÒaÂÃÉ"oº|UÝ_{bÒÙÂÝ>Nrò>oÂrî ,Kj ;1('ÛÐ…U”YÒߌWN$±¥Ý#[¬}s T¥É‡Êž'íΙ¨”´6(9î––»Àœ; º@2=÷º°öz]°^„edºÉÈìÚ8Zª=E ¤Èʇ*¥4Õd‹d þNü¨—·¤5†åšGŠáXÁž Y’kñºPD³Û& ÙÔ3¯ íÈC$JE±y×ÇÕN“Ž0ëâJž¶”YpnÈ,ËkF Õ䌒š'£„Öõ"Â’ßeÃmàoAFIêv•ãz³Ç¤  N›I¼»‰Ü;ÂÎD5"9ùC5C¶Ðp`¯æZ(•bÅ%Ä„$³!Í6~†ƒåþ,’êÅ€kÙrAú¶.ü³ä XLÛö`°†˜4¿ÊWvQSÁ¤‹‘Å7ß¼ÌÖ]ÎÎâ”5äêáó€m ËxFŒ¢’•©òªÚG]³ÚÖý};SC@æãÉ”GÚÌh½CŒs{Æb\TA²/8fÝ"V¡„ ~ÂÐÄ?CåÐAºï*Œ3ÎëàÙÌbd…ãíBi1`jmXŒ!Žù ä7òS½Ù·£`gIME²‘…– b(¬)'Ÿ¯&¹…‘vbØ¢ª! -q\ú¨ÒÕ›e\:¨N dh%­â±dúþóïÔgW—³P;•"€ðp¶$™§Mšª8vu ¹=¨BYSΡ\Šù‚yÿž+@G¬«Ã"ôµÉVAHÝë´Çh’×%ãCq$ÏÛ¦ˆ8{ÝI,(<ƒÉâ>žÃàMà<çï›1Ò—›ÿÓšÂM(…ƒŽﱪXmî@âÇÖ•Ä!bQS„`´÷øøÇ(”nÝó¶@âú°š ÐññŸûVn}0 Pcá Œ† ‹¤-²Ja¶w¡ °^ïîŽb'\iµð]7ɤ/0ËÛm½™=&Ä1¨Â”Ê5öÛ„8îA]Ð}lˆƒÝ2]ׇ8m¥ïØüµV€Ò ì2m“möPÆnµW)Üv¹[öuÑ’*‚ã’²mÜî6‘õá›Å¸ù05ú&ÀØ\„Ûš?boŠœ¼I­ WA ºË£d;Nîb[^µW‰âÍ5Û³»ÝC×kf^iÀ|¨ÉŸ] ÛÐK½°ÐBú›rTú Ùí|’*߆,¦uSÚtØ×`¡ljú¸ .w¾Ý‰Ÿ¡¸ÞE¹Ü«ÑÒ8^³Ùü…9ómÂСÂ?áP€úq½ŽGpê0¥Fæ jñ”ñqo8ÊpÏ&5dÙ¢xSÛo¤ðvD1ÃOÜ[#ðº®z>Ó\M?Ø”Jÿ¹æ]ñäñ‹[wx7tþÊ'6|Tð—Bí%ÅOÖ[•c‘!EQ}”µlÁ*¸*Þ&¿Î„«VØ‹Æw ô’&1e¼ˆD'‹Ÿâˆ*åsiß6GIʧš.‘`ä«BçW›6^HM¾ËW”©ËË …V© y€<ŽÅÙE\M€£Š…8ôU1‘Ÿ­¬Îz4õͻ*ÖâCx_|ƒ‹rU/ð åÞû·‹bxÎ@Gìò8÷û1M¨L”)²AJÛktN½UY[´£¯†f"*o²;×Ra‡Ç—TÜÅòªÂòØc—×Å.±ÏûQéaŒáp5º?¢ë©G›¹“•uœïõˆ»ûÅŸ‘BЪïúùjÙ§w%Pò6†µ4çÀvÒ|±|¯²‚k‹½°h|Çeb–âé ƒ‘?a=¼YúÂÓÏûÆ?»˜}€¶?ƒcIÒη3z†Œz¿ íðÒa ä›¶×yàdÙoweÓΟZ#Çׄ?¦3s0?}jPý~À*ò$}äÄàÏF¤ÿAͧãÇ·OÌYú‘[ãøã<ÝÛ/aAhU™qÙ]Ûlûå"jžôú*jÓäÒƒ«UF¦Æíg¡5\œ/ýà%¢¬K¢ƒ.oêûu?ò»k—Eã»ü7P“ô7|\Ç ¿œaoN0Åú?‰‰!&9˜™åC~@Š4¤a(,’ù~çVçC&ˇü6î&kd3ÙØ Û‘†QåÆßÝa0î.É¢YÁ]÷‹dÂ4@b‚ëãƒ%í¾¹G¿JðXìæ³¹µmÔ××÷m}ý0e?<"§bÐ݆ͤ?ù\4àðošƒ%ÇG…Èáåïµ,XíQSù\I,À!±Ú›Ùϲ ú{± ŒÇ<Š…Isb!g42,ûtô±«úúíèÂýHÅà}¿áËYB•pIªóúú¶Ù.___’Oª Â'géûò¾¤}vX¶]®üÔåìÍÙÝ(>£ÁþJõíÉ:(àendstream endobj 155 0 obj << /Filter /FlateDecode /Length 3007 >> stream xœµY͒ܶ¾ïÉy§¦Ê9` —ø#À=¤"«dY©]—¼§Röú@Ípw‘3kάlù§Í!y‡ò5×±"Y:,†Ýî¯ðÃ,Ïø,§ÿáïª;Ég7'?œp÷uþ¬ºÙgË“ÓK)ñ%+ó’Ï–×'~ ŸY>3Úd¥Ô³ew¸š/ÿŽÅÚÆ‹µÍ„X¿\Ÿ|Ç÷/çy–kix^²fßW}Ó¾™/¤Yi{< h…d«ù‚Zn ›þ¸(ôÕ¾¦Ý _4{²íî¢I¿P—ÊZ¶¯öÍv*$û±ÙߎÓß/ÿÆ‹<‘²™UÖsÎ.§d3Y®T)áÎæ %¥aËÛˆ‰:b=#"3…H\&\Ç’Îý³Üèa÷‹¹°YŽõ¬Z9EjÁ^U7ž…B…0Ÿ•Pƒ(ˆÆBKËÙÔlQNþ4_h¡²²ì“OÆqµYÓœ›K¶¿­Ç›û®î›UÕ†ÅÖ°ºï·ýîѰ¦`Umh6ëº^¤ ¶½ÆG”ëŸîêÕ¾æšíšŸë3§ÎÁ;äYžŸ,?MÙºi|:p%X»½áùWó‘à'ãôbúƒGÿ1LqfÌÈ캹i†UVBù«û¾Z½©_oû‘“îbŸfÆyp füÝ(Ý 'ï±é¾ãßt8À¥ÊÂÎ'îÔí3SJ©vY¸¨+ö|ßß×£H‘à4ÙýáuÕÞׇ۳ìùÚºš¿;·°@÷¯þcž‚[&3­…áª^p(‚m®2©à&Dþ‘s3[(½€ñ;ã4Hä Éáó›U{¿sžÂá,Š‘Ÿ{R)l-´„ÌŠÜ O+x«²¢½Õ¨B&¦!x&á! &¤§”Y!d~pÉØƒS* ^ƒä1!̵,‘Áó9… )’gJ–|ØŽ[„‘9c«<Æ–ìõœ¾/XÕ´U Ì-˜’ì+=iÛÑwí éÉåã/Ç_»f¡m‚×-%xÇ%Å ~ÿØí¢Š‰¹mb ãy¤}ö&¾õ&¡\µ.u ÅHR9w1Í—‰}… 0êl­\¡+B$ȵ V¡¸J !µ®uH'´Š¬¨Ž/r]cÕk’zЉP,óÇ™•ÂÇ'ÔÐ3‡qnRdé÷MbA±ômÕ;=Þš.0«A|ÛêÐÐõž¨s2x„ùˆÂ:솳%®šh#Šäø‘ýx EDÿÑÆÁ‚ä%LN$b/—Я04w€€W ÌÜŒ¤â7añ§Xgí¶oâM18ã1V¸ï· 6s™Š×ÅÙëâÚæW{d«A·à&8‰3 XÆ„9á”0¹"á%= Dc˜HÑ1žé—%O›e2±Ûâ@tÊÆÜ†ÑUÇ*%Ãܱ[ÒFá4™ÞxwÀìÔ>ë°éjrNµØQ>s¤¹Q  µq–"AFµkI@üTJA¿ƒ† aµ#Í‘{C‘^ÍTÑÐ6½Û‘™61·$~½nÓ ¶Í+/{ñ+rŒü—ò‹£šƒ0UJº¬ñJ÷Éý¸¢G’+EO‚»a“_FîµÇ)¡Rãèß„J ºL/¼÷Ê·fsíîE넎a€èó#ÇH£ÙT(÷¾ÞÇœ*y:¹Û_é ¶éšýn8X${þ_ðJB’ß§Êì¥.öeÓ¹-òšW ` K.C¢ç6e 2„ú:Jlë¾Þ¬ê(ÕÎr-*JXUsºÜSý¬ºÈéÉ®ÅÎ>?÷crÝ+ÆÏ®æHµ-$|ô¸½ÙË:w÷Z䨀 ã2£K¤Šê%Jù—ÇÁÑ먿¶RêB&§ qj¼7ý˜ð7²³9—–NøÝP$Y³«X9¸Ç“m×Ýo ‚*¨ü±È@5pÃ'“y3Ø7Å7ý¼ êÔK¤á ¦¦¼´ÈPÕXy©2àÚR©§I£%ÉÍÙó¯#UÆã/s.ŒrHíÎC ŹÁ-ÓÁO—'_ä™v-™þáŽÒS®lÆ…œ)8îÚ8ëmsv»ßßžb˜U«.Ûö7§ØÍ¹Ò§(´‘TA#ïܺxyÎç—gau o À)Ê!A:JûÆ#!Aû…ÏÅÜ%F8õAˉÄIÞì|Ä"èAä|qÔ«\d-´C„ã ðKÅP—h„ü&ªcüþq²“nK$Ð(fÇPÜ»Ï&·ãiTR‡¢‰8”ǹ?íp3Ñqýö˜­÷† 1Uõ4†ËœCÕcÏ8†ì…„.çÔûâBC,š³Tœnv™Ÿ½@²ê†…‹i_o¯÷?Æ‚d“¸j™Îí/á>l‰Z"·d @‘V:Óü… à7ÀÌp¥ Iû„óÑBC¤ j ­§ 2B`vÄ5óíûD€ˆWèä`… ê¡™_†5s´CçÓ`HSÈ^ŸEËÞ ©{a„C·ÿÁÐy?CçIeÃxC—T›°T{8tC‡Üei“ž¤(ë9dCÀIo)T ô§yòšÖçqÃP#»»oãd¸¹k#´¬!I¡¢Àê"á™Ü—´µå%êøuá’±—ÍÆ£‘¶î´·XÊôéÜ~à5€Ž‡^š@#æ§yéýŸ‚@ TøžW¬ÇÐ2ÎvVf€o~lTÌâ>°ƒ¬ÔÍãjÈâ6k05 ÂRMxh´z¿þPéKn3…ã¨èÐeìšôˆàüò=ÐuБ„DÔÿ+ÝDêÏúÄÛ·ßûë¾àdÁ–‡–ŸŠ´Câ¾8#Y¥ '’¶N´^ûÐmº9í6.Úº£¢—¼²!VùH–U7D1õ?¼HÀ‹D~x£{öeìEßP¤º@Å béÜ‚ÞRhH»¤§,÷Ñ7l6¼˜Ž›»¸]ëàicMKÔ¬óýñðþ4,¶LNæšP%‡vÃ[ÈBàŽ¡ø$tÅ¡•ªº®veëàiçν\Š¥œ{MY?¸Êþ&Æ/8•Ç3Qħ"6þ›î®m^¾¯ùKn3cyr€·z3 ™Å¡/ëâÏó¿]½«·wm}:v8ø«“ÿÅsü$endstream endobj 156 0 obj << /Filter /FlateDecode /Length 470 >> stream xœ]“ÍnÛ@ „ïz ½W2—¬c/é%‡EÛÐÏ*Ð!² 8‡¾}gÆI=Ìc/ÉýHñôôüõy[ïíéÇq›~Õ{»¬Û|Ô·Ûû1Õv¬/ëÖt};¯ÓýÃéœ^‡½9=}ößöÚâB]þûðZO?û.ôS÷šns}Û‡©ÃöR›kJåº,¥©Ûüß_vyDŒËÇÕW©>uSíŠ;ÓÖ"-c:Ãö_Š”NØK‘`/´S‘`™ªŸ‹ËT=ÒP°öŒ"TJ8aû"Áö´ç"Á²îÙŠk´¹H°™Ö‹ë´Q$Ø Š;Àjšê늘  Ò˜RSÒ˜RSXM¼F^œ ИÑE*%œ° É"Ê$Ê(’U(³PMQ&‘ãE®W9_åˆsÅ:cq®Xg¬#ÎëŠE'\ÝpvÃñ|‚Áñ|‚Á1=×tиˆœD> v¤Å0]uÔÁêâuò:†é¨s ¾ _Þ5ЉP7‚ÝÀ…ƒ€¸`0 àB€AÀ\0  ‰Ï!*âªbqr>¿tî·ês‰Úéý8êv×êiµ¸QëVÿmç~ÛÕBÍ_ž°î:endstream endobj 157 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4993 >> stream xœ­Xy\W¶®¶é®•²YÂX ¸ïk\’˜¸‚Å}mPÙm•}ë>4È.‹È&²4"[ã6ˆš˜¸›E'‹F“è0/CtGOáe~ïÝ’1Ë›—?Þïüº«î­[õï|ç;-cÌú12™lÐ ×ÕÁAS§M\°S:5J´—‰ê'“I™Ó§ 9X˜]ø“m¼~=£áòÁŒ\&[¿+haðîˆP_oŸ=Ó¦L™>q"ý?ÇÁ3ÂaÁ$‡e;üƒÃÃü}<‚v:,›ä:ÉáÝàpzÒ×aLpƒç./‡`/‡5»68¬u_¼ÚÝÁeõʵnîc'ýò¡~þÆ0ÌÔùAÁ w‡„:‡¹ìÙ»4ÜÃ3b‡ëÎ]^nÞ>«}Ý×øN6}ÆëCfÎzcð˜±&Lœ$0Œ³’qcF0«˜ÕŒ;3šYÃŒaÖ2ë˜qÌf³ÙÄ,b&1‹gÆ…™Ê,a–2Ó™eÌ æufãʼËX1<3”Q1ÖL8cÃØ2öŒ/ÓŸ1g®2Kfl3bɘ1qÌ3Ù»²;ýV÷û³|¸<Úl¼ÙMÅ0ÅAÅåå}v{›Ï}Öeÿ+æãÌ“ø ¸ggñÅ@ÃÀ/-Ó,¯ T?xøàÛCF ùÖj¥Õ~-ŸÁÿkè¶¡çU‘ªÓª›ª¬o¢Ñò¿å«t ˜pŠIÜ.ëj³6M`IN—eÂÝ¡0° ]RBIí~a›°tÁ)¡)ɰ¸ò˜á¨‚JøÊtœ‰Ý » 87- †ôv´¶ÅåU2E1Q£¬5tBÔÂP¡ãÈ LR‘ƒJìÍ Ë.ݺÒÔh 5Z¡e¸ e6|¶ØimrÆBö;Ïs¤ßBWŸy¾‚û)ù¿‘¹ñ {%vªÉGζÌð §£÷œÑ—å?EæËök'KÂÞH寧Xþw¿i1Lb½øšQVƒ˜‡r±ƒUh?ù ™JfÍN¬‰MÇDœŠ³¾y‚V±ÈQͱìÿ ü¹¸^(m:uÄïAýî¢à£Þ°6Ó[Ë'Ä0Ñ&ôÇ0-†›dWÐQLm‘wÅâ>UQbêØXˆÑ qdQ­Ÿ Ë`ú÷«> þø¾àÓ3—®Ý}šsîô¨&‹ qÙ\ÊÕÄ–AÚ^aÞB÷³KÊ烉'“ÈHâE¹ðÛŸki=ªæ7xæB›²$ JÕd=öWMœá¿ÉÓxú¯ÈÔ|¨7~"׿gĵmT0WRA‡^6ñ1&ð÷Ü`Ë>Oϲ¯ á?ZØ¢â¢â£më.Æ4Qíž?À‘TûRU° V‡ylÞë.àuö`)'‰àˆ³'Îi±ÇÁ@ø¥?©à£xÝ$+•äïFOˆ|uÉ4@¯SøY8 Q))‰ú5éO‘¡X­¸(ÅÇ‚!Ü „"E×î‘Iу’¢í´ÛüC2DCL†!µ:8cXI`@˜ÖwK«Ç÷/Üi=* ¯è‘‘Ÿžu ì,Åš }ì‚ærчb”±ûõúè$!aßî%“#4‡'œºœŠ6h“yY—zN¯NI‰:¡œG]dEIÃá3÷ ›±–8/¦E%ún2ŽÆ©5ÈeRu4ïÄôÑxôñÝçe޵ÉQì|n"¾¬â NKºOØ’ñD ¾–f³/Ì›Jثׇ$GèÂõÀíÑ(Ë Ÿ÷ÿ=¥g»t–”®O…RN¼˜ÊbE÷‹C1±E`W9‡r±º«Ÿmjw'ÕÞJÃ3¨£ãTÒìèM]Ñœ†^ÊÞ¾*dÃ/¿þ9yE–7½t²Ý[¼½Ê™Bâ4j:q ßÌD»‹gŠêõ,?ï…_ù®Ç†(o{2¿Am@iƒºæÒåŒ2h†Öãv‰ö²•T€Ð½ ß6ZIöbTtØðŸ‰{)ö q¿>%*QY¶T»™n4Rö—ÔxAIu/*ªîn=£öhq?¼Š^œ2s$±"?NÁñ8þÔó"õd´S‘8¥¡9µ±¤¾¸öD© ^@6%åF©’¬o—ªÔK†e¨xö9¹ø†ø/U³wË¢)D¾‹pÂÈùš;äåïÔ¿—¨4‘?²Ïns z]†p 6.´ÜŽÚˆc¥õ­4Ðr¦§Ø4`{Oäñ :ʻ։±*d&<$s„î 4¬=uðÔÓñªèí±ßfñÍ¿=üQM­—Â,2Y jlGµ'Ãu¯'#[kqZÇÝZŒ¬ ®³ª¹¿ú9.xžq߆ç±E¡*¨õÐxj#´oÅ”{îÌÞ`O„5o/ÈñlñUGî‹ð¡ò§)ó*ÙÏñßÇ„%ºîYýšÛõ%¸ßxpáî·«ªBó„ÍåËa:„ÂvHJÕdF7P‰ÉJ-È=|6äHy~ñ³Ú‚ê£sÔU…åéE†”$jv£8mþ¾cÇò‹K²kœj+8Ïø,fÜ>}nó 8oUS‘¤òñYEl~Q ±õ¾Ôpí*¨Q©üô£¨õê^Ÿ[hºÕÇÈדï~auGmZ(¹–ï•¿ g÷û¿kuÿ³Ñ•»80ÑF­ O±ÞdÕ³þèX‰Ž6|q×_:TEñiQûô Qz!ic€6–CÂÍøŽÄö„;„1¢}½ñ¸À=uz@\…n…æ¹’÷‘ÂËVÑT“ÂûϾðžÄlÔF—†TûÒÎ` žm¾ßæsþ¾¾Ôþ‡¼ÇùjR+NR­ÑÏ o ¤?Öã%ÎJ›ã&™¸Ù}&NÓö5ް¢:K¸g6|ÖZ›\Åñ,ÿy[Âáò+îí6m:ŽÃ5‰½¼íFñŸªfßš]žþ~;=ëšk’øS¯òŽ ×7¡s“ìÊct{ÜòX.^Æ-*ø/×ÇDVA†ÕØŽ)Mùò¹6ãåÎÎo¶›!M úâ>g…n=Ö*!E'h6…–llGÕkø;S‰lIý–üƒêóë'>Ûótož®T{8ª*6pí[Äl:QWã¨xAÒ²Wn½ö*55;GÈÍÍ>\QñþÖûQ’µžrãùsÉaYzIZú-ͯϩÍOmA×>q…*œšÌV†“XE‹2eYqp÷º¿%ã5J 4` Na"ãÅo¿dé…¬YÙ¤×[‚ÀäÙ†ƒM¸Tòm© Úð¹â'T÷C8ĤLKN‹É'ob€-Zý—“›}ìLlˆ.¼ Üad%òÊSâ““u:5YFF)D ËëMN~ž¡Œ†Åž/©„Û}}-Ì+8\z’)¶ü¼ÌxH×ø˜ØpêzV”ßVÄ´A>´HŒíå-&R†(賞ÄFš]j–zøßdÃÇ”•ðqÙ«{hTiô{¥—ÜÞûgÃßz9²7É:vž'f£¶¸øïö?t)Xãa½«v3×Ó\¶þæòÊî¿z²tïÜßɹޤüz•޾bšéZ¸ ¢B.†Sã7L¼ÇVéÀ_˜¿œÈ¥îzŸ¦XyÚ3šsÝ¥D­aqAÑ·ÍñÚµ™d—ÐÝp¨\4 ¿ÊC™¢Mp;Ÿ0Ðò1YI~Ê¿ºÕ·Cs‡‰-QŒ[>aé@YM}Éé–€’€t¡ét{z p­óÎ]·ÐS£&$<6Ž–Þ»Hq6Û»gtS# huâm©·¢ÂOúa¿CèØˆýè'ª'$FÌEœ ýŽL®ü¶òÃ+ðwwáU¢&fsÜÞØØ¸ÿXÕ‰âÓe±u[2…–æ[Ü#p LÞêï©ñ ÑíÒEëÃõɺÄH€d.2Ž g•hÃ7oGÂh—¦ÕmV›² j škªòø„yAA“Ÿ®ÅA8ç‹¿>Uÿ/-gÒo’ëÌ–ÜW¥µi*;MãÄùl…>=4B¢ÒÙ½R¡Á“DId’ª=¡šVO$AûŒ-*JüXñãM8·ÉÏøT8Ÿ…[!sƒ¥È*†Æ`« -gC†íØï¯p,Ë›1ñu•P`ÏË™rxn6ן?E}ï!È‹¦¹+ð7Ú÷oÝãn¿6çn)J0¤R€‹†ØH5i¥zs4Çš“%äå×·>¤a‚‰o-„ád׊ü÷|Õ¼Ó~¸©TÍ·3õ!•^~[f|1 ¼Ã<œÔù«-ųâ@-®Ã²‡8ãsœ!Gø‘ê†ßE÷í»ývzWxŸ©:R•%èæú¹ºo‹‹×ë)úqy±ù?<@;ã¬ÿðÜŸ€Bb¼€æÇ%¢ð„G ªv oÿ¤$ñT¡Ã¸;d@ør˜¹C¨dáô+Ç/”¶´5^§Õ¸>¥eÝ­û²¨VQ)XFç‰nÙ¸ýhNžÒd޲‚¹Ùš`‹þ`1 *-5--Õš•™{×¢%ýtÞ!Cvfš!;Ýb Ãü!Á bendstream endobj 158 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1483 >> stream xœu”iPSWÇoHHˆ yÄ´‚/ת –vÚâèXtPq‹(Kˆ PAA¶˜E@6”­DE­¾Vk­ ¶¶EfêØÍ.2-Š]tœ9¹ÌØDû¥Ûܹ÷Ã9sïÿœÿ™ß‰‰D“ׄEéwÅ¥­ÐîJ^´Ð/J«ËNËtdf Þ"ÁÇI˜*ºulh,ÂÜÄà&ùÈG:WŽ{<1Ù·N"b‘hCj^>=/3Y·#KýêÂ…~~öó-u|žz¹¿:4.!EŸcHIVÇ¥%ªCýÃüÕáú{0Y=GŸ¦Ž×îˆKMRë“ÔÑÚêõë‚£Ö©WF­]±îÿÿ¬íoABˆëòôLƒ6I•º‹é$’¬#Ñ$„¬$«H #ád‚½Q"!"N´Çiš“ÙiD|Y¢“Ô;ÏÂ^÷gN7|ð¸Ÿ6òrôB% o&*³Ñ—ºál%[OÆ|1\ßG}I]F›?¼ _2ÃÁ÷èLnÜ]ó`|ØO#Ì‘²¤g?RÑ%ø­‚ $oëC9ꂨ–²¤é  žª£ôklß—º';=6ò¡¾xçKÙeE-ÐmšÖˆ†}Œ½®yBcxœfD|J¿ü”âôR²“„f4(p¶ÿ7TW˜–Ä“±hp‰³FÖ -P»¿Ù%ÃŒÑÈPnA¹Ñ™Á`Y—¡oï)`ÐõñW8OE½&Sõ†˜ÍÛR;»r9l’±^Ýíï¶Ÿ÷¾Ô¿šz¨ÜŸ‰zn8œ¹e^o³ë“Ð]ÉF3‰â㈎-[ã «²9ÓÏR¶“:ÔoVC¢ŠÞ|¡z >›ñeþ5\iùN:Cn~Z|ONggOk?gß”AÊlX×ó[¨w衺!1Ž£J×S» ëvöêªãk4‡Ö‚˜ÛææûU«ß©äÌ•-Àƒª6Õ7ö~æ•ä•îáòék´ÀdNÛ|<ãð^UOÊ©’ ûúKöB[”Æ–ÏUÔ›,¹À ,KEE²\Ø×T] ‡›¸*kýÁ*K¿þ,4Ø-ò8uûŽÃ‚¡nRÖkz1Ð&?^¿<„‡Jö©Š.Ц\(Ïß_^XÎÂ#ßI°Rèy]…i{µùİ]èªX@Õtæï¯£§œܪšSt­”ÝqÉlAÙ}ï‡@§g9¤Yn?á1Ý&EòÊÅ‚¯0¦8»ã|ЂñTÊÍŠÔ\£Oþiï“~Îcº|m®µXÁdåŠK ó!ƒÙÞ—ÛÑÕÓz†sŒt« çÂh¦ ßÕÙtgäÈR1Š‘C±’u"Bž0MÑVÐ_ 3&k9VRt"a“UïM'F/ÙޜЙ¥JM0&AUn:°GÉî²è¬¨)›/,Å`\ôùÀ úS_  )ͨÌ8 '™¶ƒ‡c_º\ZgË»îî׆î^Jï+®U®©µÖ[MÆýåPÌd6æut46ãhÌ|ÅF ›9öê²K008a›¸Ññ‰ŠÄ§ÏÖ^¸pã=häHïžËµ{愼ónv?'×ç;ô1¡Ÿ’3>P´Bq^EénW±-'S(½Zò‰±­ì}“¥h ÑÓÆ°Oµ_¹54åÉÜ{t)G|A³´ÏòôÛ×OÐgdx?ìþQÖ]pLÛ’ƒ5PQ݈ââëÀüZó VEOs!L§r‹±[ÊŽ|'e‡ÑV®pŒVáIæ5Wä‘(Ù“Ø>™󖱃/¸}NÎøEÇh=,ÎîÏÄo¯w4ÖÀŸv ?bGÿ[ÉÞ²ßÅÙÃgT¼bKâ†t.÷þbK ÁÆø´µŒé)û]ö/ ÿú´2ßå/i)àèñÐçŠèù¿)g÷¢Z!â Æ¶ª•ò®è;s•DëÝ\ÀmB¯Åj®´š««ënqsã˜ÏÔ¨¯©2×ZÝ&ò'.€ëòendstream endobj 159 0 obj << /Filter /FlateDecode /Length 670 >> stream xœ]”=nÛ@„{‚7É}?2`lc7.I.@QKC…)B–‹Ü>3#;EŠ0Wü¾÷ŒÝ?½<¿¬ç[·ÿq½Ì¿Ú­[ÎëéÚÞ/×¹uÇöz^wÃØÎóí³és~›¶ÝþéÛ´ýþ³µ´åÞ¿OomÿsìúÓp?4_Ní}›ævÖ×¶{ìûú¸,u×ÖÓ_Æû‰ãòùè€G™±æŠ:TõÄêUA-¬QTc«²ûõTÔ‘µU•gGþ*Ò÷#Ǫ òá1ë=ýðÀz¨ ¾=°>TUßâ *™G¼“A%óˆw2¨ µ@Žé{|¢¡££¡££”ª ’¹XUPé[0 ÕY1 5XÏ &+ð‹  ð‹ ÊTÔ‰õXÔ#+lŠŒ ¼&f#³×Äld6ðš˜Ì^³‘ÙÀkb62xMÌFf¯‰ÙÈlà51™ ¼&f#³a䦱Çn4Aš 1rÓØc·¥*¨øG|tlÀµçø.§‚ߥàTpໜ |—‚SÁïRp*8ð] N¾KÁ©à˜±kÎÎ9;fìš³sÎ|—‚S!0ãМƒs† ƒÀd2‚ BCAÈ`2 A!€!È d`Æ¡9çà 1™¼!æ s`¡-·À)„°Ð‚[l ´…àHm!¹…„kÊ7é›pMù&}®)ߤoÂ5å›ôM¸¦|“¾ ×”oÒ7ášòMú&\S¾Iß„kÊ7é›pMù&}^Òô¢Æ5œk:Ûx¶á\ÓÙÆ³ ¯MŸ¼ï¾.6^}¼D¿îÌnþ¸^ÛzÓM«›”èymÿ.ãí²ñT‡ìþ9_\ÿendstream endobj 160 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7781 >> stream xœÅzwXTW÷îæ»2Ž jÎ`ïDì&k슂Ø Ezp¨C¦¬™¡÷:tD±Å-&ƘDc$šXò%–ÄÄ샛›ïî3¨1‰Éï»ßsïsþ8sÎÞ{½k­w½k”µ%l—-w tr?ÎÅËGàÆ_Î p­¸7„žØøLÕždÝ…ÐÝúäÀ‘gm¹%}Pu/´ª7%Öú†Î Q„íðñp˜0~üÄqãÈßé ‡¹ŽKÜ=ýƒ£Âýw8¸mwXâ¸ÜÑaEp¹¸Ãadpƒ‡—¯{€·C°·Ãj¯un®ïº¸:,tqv[é:Êñ/çzy¢(—9AëæÏ Ù0?ôݰá #ÉGF¹ïôX¦ð\½}…—³÷J_—®~«ýÝÖ®uê7aâ¤É}¦L4mðô·Þž9¢÷ÈQw6ûÆæqßIÿ5ž¥¨Á”35B­¤†R«¨·©a” 5œr¥FP«©‘”5ŠZC¦ÖR먹Ôzj5ŽÚ@ͧ©Ô»Ô›Ôj<µr¢Q‹©‰Ôjµ”šL-£¦PË©©Ô jeKi)1Õ—’Pý¨(ÊŽ’RV”=%¤úS¨K1Ôª Õ•ºE] fPT*ˆz‡êI]¡‚©^ÔÇTA7Ê•8²¦ÔSA£Õ «Ra?a¹[Xß°q³9-š'ú™ÖÐ7™¦­‹S—ª®«»ÞïÖØ}j÷üŽ=ÒzŽì™Ô«w¯´^Ïz¯è}°“í`[“Ø]|¬¯¢ïmÉ: î'ï·ÇnˆÝi¶´Mú³½¿ý¿û¯0d€iàØY/¿±î,Ö‘õaOÉzÈÖʾp˜ì9hì §ƒû nüpHÜÒ!û‡.ºyhü°>Ã`¸jèÙžf´ÞÌmŽ´»÷3+hgˆËT6à€vij¾63b@£JÞßK묪ڨÏÑd‡ Ñ •¢7ÐfSýîú;z{3…OØžFûz¯Î$‡HÔjS”X„gJ±¹i©Yfy¦âýzÆLûjæ‚à~Fi@)} JSJƒÑ2l–âi85.*póp +!¡±NA“†ì°Y]%mLËÌEƒ‘·MÀɵQ {HGoã±n4^å$ v# ¡K&Ôb¶E²6tæÁÜÇvâƒí2´TßLÿ ó”^¾Ÿ1ß¼y÷c;¬*E× JYG%í£U¾Ã†pEâd÷οd¸7úZ²tÃT,dñ0¤52³¨·H|íAã”5²JÜ&™¿vúP÷mÒf6ÈP5ZI‹­µ:.’õä4Ê*n¼IPÛ†vµ 9ä'A}G<Å=pŸÑX€û`ÉÏcPÔãLJHÌNË’€¸É·Ê·l ZÛ`kyÈ¡°pš NV¨9t¸|/€ýòêmÕÛ`xñö^™FÉÍíãÌ‚÷Ÿp!»„íãPœ$2ã• JÔ±ÉxˆÃt,f^·CÇÑÚÝçàÎx<¼LfˆM0E`,—¡Dº2•j5$$³ëçx7­;:ì±3žŒ'âmØMÁNhšúÉ#ë N¼ÆŒÆš8{s\•íÓ˨¨ÍNÜ›+A$ý[Ïtß*b/Ñâx(ŽW2U[e¾/ÍÚˆl~Çt6Óêö0¨ÛÏ‘D6­îñîÔ9ž^eûBظrÐCƒÂiqßcuGêŽ ¸zn"¶áOâ9‚ÝÜoN/äN£2I˜(ËvŽÃËINMqRîYf.y<Ó¾HQlÇj‘ËmªD™Èf×WhÙÐIÔaßS” ƒdûèt(g9wYKu&boyŒâ Û×¢;ä‚ '<ëõÁc%B3‹F¢•²ý w:ûlˆ qY5˜áAÂí¡-qôXt.ËÍß¿2{2Ìä½Ùëì TGW v·¡¢ËB®¯‘ nÛ\ŸEÛâXdÅó˜ìu<&2î…ð—C$=G›Û$CŽ´xä£Ö;_d@g`5º¨e‚ËcM%Uyõ,1T–7ô°"¬0ðŽç/ï„U¡!UvâfîWn£ÄrØC=¬H¬76^‡–ûà¡#ÆìG‹]ÆB~£ énÓ?ä¼bj¢ßv2ʉGuBÑ]„FC•kf‰[ºPJi2”rƒJmÞCïE¼g'ž†:P_ œÜ•çW¿=Ë=Ë5wQ>œa«÷ÝFVéNVŸ” L>¤—Ê~´$hªâY:1I­ñªõ€Xâšž^‹\}‹‚kä²úÐZÕ§qŒøªI}3f^ÿu¾ž3§úœ¾µ“ÕäëÒ‰‡… KéhHÉM×ëKKYƒ %¥ÜêÊIЇ>ú”Ä…°÷aB*(ÎÌ ³ðÊ”;Âöp”J¢÷$t?|Ý×ÓwJoÙR[cqRð¼¡ÑB0ëÎþzÏ (cÿ_üëÝNŽ$!¼OÁ°;vG“ðDärõFõ»eùò½ž¹ÀdCV¡ Í¥[ÒÒ?$>¤|K)«ÐÛQ(ÙŒ–EÙþ|™x°?ñà3t õ–œ[MÏ ôò^÷ŠYdFCÌx_ã&…‰tÓF©9-6ßÂu"Ü뻄¦+µW.²…ý¼íî þãÄÎmýÌáô;|Tq•t“!÷[iùjæ¢å³Á×ÈTÒ–(Áñø8Šÿç{~§Q£ñ3R¢öÀçÐHâèù¨Ç…¯¿§“d•&¥ù=3Úoh}©–XTÀ»É™GdÑâýxÄïi²€ž´qáÜ©êÃÇYqwt‹ïëüö:h&Èðhz&ŒGcß?P{¾Žu¢ ª;¾ ¸w„èv?s(=CóÜzcî—l5oÙ b×v˜a±¬šþÒøÜ2rÊŸúKræøòù© ‰åDroš¥\œK熒À‰Ðé"`©út³.7vB’V­VÃYRlêUù`_Ý%,‰2&<õ".@š*? ÅHšgHÍrgvZ²C×¥ÙÅû/éŸWA²¥À\h”´Ï¶»Z6•“MåàÈoÚ¤3) T M³¥#Q½:Og€tûš(#{ÑBPç–ÍP¤Í‰OWåfS¥cQYjˆŠy~/9Ÿ#áWú(äiòü‘-þUšgLæÏfÈH/ø5IÂÍiJþ’}>ùóvA_IKŽšóÉy‰.0E›QÑÝ÷L¶õ×çå«$Œã¹¨;’÷Ã\éUa*¥Ÿú`:‹6ÑÐ ->ÍÛ[Ömfú‚M‹Ë¢«kKʪóR6ëe5Grë9rzû™7½Nó®fYàìaka+#V¾õ ìÂ¥C{—²â¹ži5Ÿ+øJ†ß>&ëÇÎÛ±eƒGãÑS­mhzÛé50[ª˜mó8½XÃå“0¯t…!¢÷Gs¤»öì9RYmnÚWx˜s¡Ú@](ÂC¼ž¨0±C¹6+>¦?Ä$Ƨª–Ï”Îü1)‡—a……ÙezFœOÀ£4‘°IÂ#ý èu‡a‰t“3h7¹l\µR d¥jƒY_ ßk¤dÿÙrcJ~a0Õ5œûô‹Ò,e~ qdRRlˆŽkHA Œ5Тۥµ‘2çZÑ&äÝJjËâ6d Âäðsa2êÍܶIâOèN]bÉ›Žïªè¦ó…­ë?ûD/o­sЖÈ/?7`ÄÞ[À§2¼™h#”0ȃ†RÐçµ¼*«BSh¥Wµ‡Ñ<˜ží6ʨ(nÂózƒšˆ‹?ä¾´TUå°8"þæŠÄã;Á.z7|Ï6˜E⑟ñà1`;Ì|Î$â«–%¢çZÁÝTò5˜¸­fÛÒ¯‰Êýk²™uEѤ[HÔiS†c ‘I£M#Á\Ý ¥J¶÷ˆA¾ht‡@¶R¾:xÁR°_K%¢~g‰9-ËELõ΢ˆ(y|à–VŸ£ö>]É¢ùܬê ÇôE@ð åYºá~³E¿¬½/ä&¢n’œDЄWiÙ Ç% ÞÀ¬™¸MFSo¶žÈ¾ ói”yhTÏ„–DÕV—ïúxVË;¸Ï›˜Â½qßG#ƒú×£î9$N…Ùæ„åP‹ kQâWÂgÂ×6ž) Ð¥(ppÇY)äN'™4Ä{<óe×Ð!°i(¯)ºQ^Œ…Ã52®IO#Õÿ²JO'ñkŸ Ƭ´\¤kï!Õw\½ ëfãÇ„ôZà#hæi·ª¸¾Dîs]„Ü0äL<„»FnÅ )Ò]EÈÌuÏεðH~2(X|•èÐÉD‡füTÚŒ¬Hù‰p}G$%h!Õ>.“¸µ‰~/ï›Ñ)Õ|% Ж^²{q•/ ÷3-.z% qÔ´­Úßzð(,Áâ‡#‘èâÁÝõU²Å$©Ä UF3â–[äÛà®ßºOsöA³álÝÁr󞆓Э±æ-¹ÑäT æekˆÖrÓkI½lwàuA îÂSâØ"ë˜Eã§\QRžN¿“àýN@¨Êt…º ^;™ŽÒ¿Á½˜NOÕëÒTÜØŽÒì½.˜È,•qGè8ü„}`åh®¥±Jºô<Â’ ©IZU²–õꉰ­Š×@[ŸÛ½Ð} Ú†Çfh ^ˆÇáI؃HG<-@KÐ4ma‡Hp ~cê›cpÿoQÊCÃ?nû ™³ùã;=oêѤ¯³Ld}éþ7BÔÞÞKÒìݰæÝ)k±˜žð%¾ör÷s$2ã.ˆ¡¿}ï½ÆBH)dÔŠxc"Š¢jê Ë*Ù—â~O5º`¶m|·Oë;ñ¯íÖœJòpä·ø ?ýkÿò7B% ͤQwD}õX6´ß& ™9‘ûaUtŠÿ;"4mà›^ìQ\ά(ª@P‘Pa‹&~NûÜNL+97RRœP¿=j«ÊÃceƒ»»Q>ÀqÁ‚w¶š¼ª"eñ± ?ð…€|/s”s´ÿ6ðdæ=Zz¢®?»Þwl]-»¦v¬ ¤¶ Rôþi‘f¨'â¡¢¸¬%xŸ¦˜ï._¾ÖÓV!kÚÝ”^BxÛN FRª„&:?¡(§4³‚Åó1%lXrBD°'0“àqE¾¾°J&¾¨Ì˪¨Ý;à!CVÝ$nó×¾à؉C{šÙD·‘5L–½ÔØ?ÏÍ*íê?Ìj¦ÂVçF‡~½h;ËPñßNkþnVóo«[)¹‰¸ú„ ït5?—¶‡|+É€Üx%$¥èXÕ|_El€äcqßÅß*.nhX]ú òú9¸Îü€E_ã,þè•h½ˆ‡&ã Ï]±4@/â!Ñt‘';öø@,‚%à¹Ï‹óÙwJµkÀõ⛵2,ç&J„¿…G²¤î䉠òLÆC”sY«ñ0Ÿ@r¶3%Z‘à©í­_ß"ÌV…€€·XÞ"ã„´ø4và1ú0[E˜ÍôÒ~+c#4jwëìÅÒÕÜ’šˆêÀQÁa!¡»v—ÕV±¾!­Ì»f4Ë|Όު¼ñ£‹hÙE!§F+$ðxñÍ©e¸¯Yº¼pûIÒ|}ròÜuô¶ OÛ’ÁêU Ê}Þ}¡Í–þ%E§KHa}]ë<öM Ô&œ:qдs¯‡ÈrÕÇ>‰®IÙ•Rë]šã~Ìüõó¦ÍJ?²†]uRsQפËIÍ‹&l“¥ ËÔr3YcZà óŽ‹>wHèrã!²’uR)ðEßrá`<ïûu1æ{ä½^Â)i<–‡äZ66ô–¤ÉKS# ?”-L++€¦ZQ¬ˆ ]û~ðéÏÏ_¼ÇŠû¶¶~DD<üWD¢5fASʺƒ²ª„ís¸u’|[ŒD;-ã’4¹°¨†m¹”ÁHÙqƒYÏÑ>ãOpˆ|žÀ>'žô`(ØÍ×câì‚’´\C äñB¿<™y!8y& 峿é¥Ï/µëÚ¸,âxoƒ× ,F ¥:CjÑ[iWÎæd]8Öj(ç…g&‚Á–âxáYªËQB‡´Ô¶:sØc4œ2žÊ:™VQpûÀy4¹H³ù!T9ó¼:ÄW·“4„”„††(üØ–ŽúX}rØç€1]_Ì´àñ’ºðÊ  ðð  ÊðººÊʺN¸Ú{U Z–Eš£|rÍ@“ò WëÎò˜œ¥{?m>r.1÷'œ?â­9Ž Ã–ÖMlnBsXUôª É®0’ôÓ¢_Í÷m¿²óÑOpÙ¾ÑÙ÷¾!ݼK½Š™s¶^¹zqí<¶¼C"™3{íôÉóη©¿xë0‹zͬÝy8Vð“ùYŠ[‰ ZsÛ'H eÑ…Qѱ†(iµuEðšËšî]q¡ î#§ª=¼ßËï¢ÞÄïO{nJ ÓOX½A±eë±%Âf3¸Ï·£õ¹}­g*XÇÙ¼*ÚͰ;„=UWl/”Ç&m_tÒã’fc ò—½y_2mÇhÒåØ)c`3\P4ÃQ8'ápysÍÑ=ùDì4ì(Þˆ*Ï?mÙæþ/\ƒ‚Ÿ n?¢Õ\Ï¿º_·þ«[,âÙ‘ÈíŸ6’>¤Nû™Û‹4I7êÍÔç²2‰ š¹tNJòï òé İ},²ß‹÷ ÞoÇ·±%e;!ŽíøA·¢¢J¡PÆýKTX e2¼Æš|ËvüKÛù]ŒûATÀ×yJnJ>ßÿûdç9ƒ}ŠÜ¢Ÿv²ÆjÎUR]ã—¨R±:­VÇ/ -H«ÏüôÂyYúF&35-U9mîê\¹ecIM5ÏÿÍc¯°"òYl”àÑ!ú§HˆÊ4Dã>ÈÖ­4ÐÜ=h.ê…úä?_GmT%:-Äâ•ì:l•€…DÆÌÌÅ=Na›³¸×í%9Àd¤3eXÅå[‘Qו¨ÇjdãŒzMþ0•Z­Ò€¶T!{8ò4ž˜ˆƒYÞ¤'ímã;S¥©3rî~ŒÄ°ÇUÂ×}-€èïyÕåõà«ÁDu-šýÇ·-³ÿîõ@WŠ?ÐBýà ±ã:$•‘!Š0yXyD¹¤ª‚E úýåÚ«sm$øÞ¶þZ9Ó<Ët;òÄÿíñ6õÊ|{öì?¸S”šp‹»Qƒ8ÁhHg6÷>»W€ºî¢,l”ìýl샽øßbéWþ9‰ï4ñï0ѰK@tú)ËD®S§ il›£ãcÒ^«ÓB?‹C6"qÇ£Û{ÏïjJŒ(c=´ª`ˆaüªãK+*Šv}°ºuŽ#î¶ X,úãHhDÂßåí54>”ï!ÃPÿ¯ðˆ-&‰µU/¹¾ÏóE‚dä䲆Á+¶nR©t:P[²2ïË/;j–Ú,·˜åCŒzðŠQ¿Ñ>*5èôjƒ½é™ÁXà:Dö?×çßÙøq³%Ø£÷w_úŒoφ¨MJRÇ$B((²b‹UÌýÐøa"ñóXü†çƒßÆŽöäß_-w£óA.*¢:ä,9ƒKVѶE¢•Q¶–Y¡øÞÿ›i¡XºÕIpw4N¡Ì{ùIÈRf§ÈÐXÜ“|¥Í©ùÁQÚj9ý²’[èþÄkªõÿ;4œ£¤DQ¢ˆU*UjwÇãŠh,ê™™• y|ó!7µKM‚–6”Õ&ä¶¡«¸‘zÃ÷³Í?L/rg˜êáè¿ u&¼ ³ÓœöÍÚÿÖÕ(¾j~Q~àûúËé׉~Ÿ–'!=ñBåÒØ±.[`;¬¬Rü Ï®‚¸¤(™ã ³`Ù«}&ßo0 ,ÑI~…í_ɹíšÁÉÙfoɶ̵‰.ž± 6¢Ñ½l=0ãp’xÿ‡‘ü$%>Ø>@²]›NdŒ> stream xœ]’1nƒ@E{NÁ X0ÌÄ’5Ó¸H%¹^‹Â€0.rûüùØ)Rü‘ž}ëÝâxz=Ú˿Қ÷ÃØ-é6Ý—˜òsº cVVy7ÄõA¬ñÚÎYq|kçïŸ9åhHýÆïí5ŸUYóS¹-ŠS—nsÓÒŽ—”B°Cß[–ÆîßO•n+Îý£µz1&TàÞà¸Û*°6X;¶Æ[`]*PŒŠ#¦Öœ\ûä:LÀ›4ܨñc„£ÄGIe °rD£°YØ #¡•¸•4ÆG5¨Ž8«ð¼âç ­Ä­$ŒŽ1ÀξBgqgéâ¿>(•’ê’ A¥¤º¤BP)©.©TJªK*Œ”V¨~mÏûñô·ð¼ú<Þ—%+ „¿ƒaLojžf_•#Ù/É’§endstream endobj 162 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2901 >> stream xœV P×ía˜éF‘f@íWÄ \ò5ÆÄPÐQAGQ‘UDgæ# ‚ "²Êª´KÔ˜ÍòÝʯјrùÆD‰?©Ûú¨ò÷h0±ò+õ«k^U¿7ÕïÞsÏ=çÊ([J&“õô·8zChÔh¯‘Ӣׇ[·†ˆj™Ø×Fì'’õrâ‹í °—ƒ½í¹¾=–9áÁ^¨ë‰s)¹L¶4"jztLòƵkt›4c¼¼ÆŽ)­ã5aÉši£4>¡«"£ã"×jB£Â5>£æÒÌN”6×j†FGiÂ"t¡ëWk¢Wkü#5~Þ‹ý4³/Xèç1êÝ Þ¾Q¥ž½qfܦø9¡Ia«ÂçG¬Ñ­õ[¿aì¸ C=(jµ€ZHùQî”?@-¡†QÓ¨ j:5ƒò¦<©™ÔljåC£æQó)gJE©);ªÕWB‚²¥6Q×eÃe&ÙS›l›ïäïÉãme¶é¶ŠHÅce1­¢_1aL£]°]n·~Ý.vwíî׽ٞŇWòˆ "ˆ+e/þé" £IÞ Eúá­nѰ3cG21wþÜ[ŸjȘ L‚V‰v–FøŽÜÆÀ^~WÁiì¡ÀåE2D1B«l°ü­Ð¡ÎÀ[¸CE’”¨Ä*…Ã+›´‡Öû:íy'´n† Ò•­‰‹0 è_݇/YË!E³·È” …–¾” á<¹4SK£“ é¯4Ê\[’0™#eoŽâu}“ÈÖ˪ÑsÑY.6b” ûxv÷É^ƒ‰q|èŽñÃØ“#Îùªq@(ÂzpÎÖrÅÇZJNA ´l.Õ•¬XÎ8¼’Ý.|öoH:lFWv¨8_´U ¨\ê½*Èw‡ š½A&ü%èøê%¼Æátúj9:<ƒ¤”¨°êÄÊÊê’&NBåú>ëçË,dèŽÐSÀ~‚üÅûâ\ÕzÔ+:Ñ"ÕyPVt;à8œ”Áq#5–¦Ÿæ…Lå¬Õ*§f„ ã‚°5J|Ê>ÚOì¬ñz€ÒWGÖ‹êj§†k¸õš+›$ŽE ZëtGÂ+#s&í]ë“sé ßlˆòÏæÌ©æÌ`Av‡.†¼äFH çb÷êrV³Œâºê`ÌÁ¾I× ¿µ¥^3 2S2”Ÿãð‡wN¶Ðš»ñ?¾·Û¸I´ds_©Tâ£7u’‹î.QŠP)ÐaX!=fa´¨ì|D”ZºÙò´IÏOÐl`ÄOôõ\pGÖ;U †[ù¯OR•¥A7ß {¡ŒÁHúÑŒ/‰Çbâ°slp]REUuIËѤBCw$§Ú\ÌͺÐÉüZz†än2˜aÓ‡£cò•;BsK)ÇNY+þÃT,€CÄåRX.{÷åäÞ©Å= ƒ,û ÀX°c§Œ;w¾?²·ÒŠ&AIzˆt|F/âK\‰{JÒXnZú{Ës©Séä¤ì€¬ÜÝ|;ÊІ¸(Â% ±·ü®úzѹY»J R×:¢³+#¶cœ ÝFþ@O ŠJŒã°&Þo‹ÒÙ.Њ ‹3ì—»Oì5{¹²OÄh§Ú·¶%›Œi™\¬ïò¤@`èÞö   ªê †½<럼٘°½OWqî&gÇ–YS MâöÃ…ÿ8ŠL.ß•êA”KÉZEDº³­¥÷zËÉ_i¶õOi’¥tPãÒœuÒõCŒ%ýIïïGàÐÏO*¯â—Ñì”Ù²Éiaþ“ÕİÇÕ“pîp#_Ù"ì©‚ ÐYÅ8¼ì B° Þ“'t?{ô,Þ—WÖñEÇ V%ЬÆ±ÂÕ¬S(,}MÜršX…¦"c¥Ál‚x¦Óƒî êl`AºÉœ &ÉV1º¨„x“)Ú 1Ïg„hõF­’bi¸jvG |lå»°‘f}“!Åœœe1™¡”Òbfç=[ºuÙt@]ye¼x“†R³ùˆ…a-‡²àˆZ‚¬§Êª¾58áµ ú픋ۥò%AfŠ1s³žKX¾8ÒG§¿ ÝÎðx^Yº*ªô7‚Nó«ë—Í”ŽÆDz‘>φá{8¦õ·B~öQ‘ eV£¹¥¤æpSSA% dW³NêÏëdE=Žx:ãiÜÓØz´}ütMýšf'ÜýP]YªCđȪ•0{,Ç~3¾>q¾~øf¯äQÑÙCµ&<€¸ûemm/Ã>í”U¨€y|—¿eän|ã7\Ï™ð‰’mÿs žþ?ìø•lrl—m~ƒ^NßJ"န+[Ž.Â<Ñf/iÖo~ö‡[:Xlï+b‡ªUW¢Ó…„ÔéZ[ëêZ—ôtCZEºUöE;^i—‹×0X%•fÂ]¯b2¸ª÷ª<¿Zøœi=réÙŽµ¤o·+Œ].†s_ÛX†É´-[¼¨Í'O+2búð>5+JâùSËjw ,î¡$µ¥ ûSË¥â0ËcgœLFD ÎTÙñ]†æóÚÐò²$uãÚÚ¾ZöDß n8þ*:ø®ä%§°‚ËXÓ>†m°/Ô4{å/Pö´â%?ðîtúæçÊžz9ñMMž6òZ´"–K|âi‰€q°xe¤/c—îþý¸ôàÔ¥ÚÒÄÞÖçoެ“Tzk5ŽœÜˆÃ¯c¿†F§;ÈD>ûöse¹)bÎVÁù¨ûêWJn\€ûÌ­É—$•ê>iîĪ˜†åÕÇ> ÈßiæêŽß]Ì=ËÜui&â:Pχ¦LÓ6“q›•ÌŽéÉ{ ˆc¨ãJi¬ñÔÂà±Kw]Î×ä•—C3Þ£NDV‡êbG·/@Çj(œuãÙc^ŠTBL&ˆA‰2üÎêñµ†¡¬]&ާ+ŒÙÑ &SêVŽüÒ9G¡Åf"#¶ZºÁòøõˆúàõˆºF¢%^î"-zaoô’ÝE/9nmþJFÒlû?jaHRÂËÍR0”DN'²U•mÈ.ªÂçóPtŽýfë÷Ò\ŒAgp4Ú |ÿ~³²™üm–Œ”ÐÕ)Éñ"ž›ˆ/ôÒ«†Ø|Eèdz‹Ù½Ç’Ï¿{¾]ŽÑ"±¿×:´ÑÞ›ƒ´××IÀdl3¤g‚±p3NĹ–x $(Œ&6Džšj2A&“¾Ç°»°åXa'¥êY†¾ðãž/.ÌÕ%{ò•B7TvçºÙúGÛÛ}÷‹ÅlÎÚeÎÍ­½ho/ä´ìÍÉ·ìÞ••o±ïAQÿæ\Óendstream endobj 163 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 321 >> stream xœcd`ab`ddôñ NÌ+64Ð JM/ÍI, ªüfü!ÃôC–¹»ûÇß^¬Ý<ÌÝ<,¿¯ú$øÝŸÿ»3#cxz¾s~AeQfzF‰‚‘±®.´THªTpÒSðJLÎÎ//ÎÎTHÌKQðÒóÕSðË/ f*häç)$¥f$æ¤)ä§)„¤F(„»+¸ù‡kê¡; Æg``` b`0f`bdd ù¾†ï?SëU†eß/žø>ã0ãë‡ßoÝaþñWìwÔ÷[ŸVž»Ô}GòÝoÆG¿•å~·þõzøýâw#¶ï¿/²–ÿ˜ êâð›Kî·Ê÷ßUؾsœ p‘ç+]ø#`Î÷ð…³²àºÉ-ÇÅÏÃÙÍýyVôöÑTž#3zûú@| —‡—饮endstream endobj 164 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 934 >> stream xœ•‘oLeÇïÚr;¶Ž Mc«pwŽ©óµ“D]â^ˆAã2Ü"d3&…u]¶µ…–»Ò1@èÝý®×µ¬°u…i Ã.l²%[)Œ(‹Ùæ&&‹ÄÄ/ÌŒ1YŒ‰y¯ ^§ñøÂ7Ï‹ßó<ß|?¿ŽtŽã¦Ýõ žwìîí¶êZOÇ×:í®¶âÅÊc¸R¡S*õÀUÒ+µ%`ÔƒÑðÉ—BŽrôÖ&ôæfLãÍí/{¼¬Ïå<ÔÉ!‚0X ÁqàfÓp’ž ’â >^¸iŽ„E‘{ÅØ dÁ±à>2242¿ Ã<}>ã‡É1´“p‚~ù:m¾B\OözûøàPˆ^ždÇ ™NÀûqêSˆ&$d‹ö¯¯‹ç»‡(¶Žó½¤“¸NŸŒ^€ XPÉ-¨â¿ÀÒZ@€ìÖ"2Rb> stream xœ]“ÍNã@„ï~ ¿AÆÎ¸›HQ_àÂa‚}ÿŒ‘8– ‡}{ª*Àa5Ò—ñtê³Æ‡ûLJÇu¹Ö‡çý2¾–k=/ë´—Ëç>–z(oËZ5m=-ãõ›´ŽïýVîÿôÛß[©ñ@™oüÔ¿—ÃKs:é§ævh¼LåcëDz÷ë[©Î)Åyž£*ëôßV>ÞN ó÷£ eÚÔŒlBNÄ1”yH q Ø[ì0)µ<Ûb‡òl[Bà±%%¬Õ9ãO˜”2'çc(À#ÑBÑC:q8Q!«FfŒ Y52kdTȪ‘Y£ƒ+“V` F*tªÑ±F—Cfb °ê›Œ †1¦QÆQ†1¦QÆQ†1¦QÆQ†1¦Q¦Qp5ù} ®&_£¯Ý…¼#žBžˆP7éõ ê&}£¾AݤoÔ·9 îÇÙñ&\oÃù6õ] NG}—‚SÁQߥàTpÔw)8õ] NG}—‚SÁQߥàTpÔw)`å5ý¹¼±¼û?W½?÷½¬W} úxï—µü~CÛeã©©¾zYÝ;endstream endobj 166 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5164 >> stream xœ­X TSwº¿!¯KÝh*±ö^´Öj+Ž[í6Îh­¥uÃ"Ö"ûvY!$! Y¾$d! ;‘=,²*¸€K©k«¶Žê´ÚmÚÎ{3ó^ç3—wúþ­¯í³óÞáÀœ{¹ÿû}¿íû8Ä‚ÃáÌܼeGZJdêòeodE&'F{?\È<Îaæú0Op3ÙÈz"|a*¦N85wîS³Ð‡3QÁt<ƒàr8¡ñéëÓÒó2ã²V,[¶20ÿ|1 */à•¥#£…i¹û…‰‘©1—nY°5-˜°(-5 *6!29. -.`Wìî€vì Ú²mçâ¥ëŸñìºÔ´õ陯íÊÊÎÉÜ$ŠÚœ½%fklܶø„‰;w…$§Ì|iÆÜ%O.%ˆùD0±X@l'vO»ˆEDñ&Jì&^!–aÄz"ØC¼J,%6¿"^#‚ˆåÄëÄÄJb#±ŠxŽXMl!¶¹ÄãD"‘BýÙégfì›qgfÇ,»ßB?æÑSüdþ—}:{ûìRÿ‰þ_ÌY<'~޵MûÞçëÜh›Ù›Ëy×ó×ózß©q¨ÆÚ ¥"<æ²RebH-¦×²'´*]1h2kA£ÒRm¡zÐ*“Ë\kr œƒ ¯l.«ë¿ö‡ á9[ö±S$Ñta¢¦rÈ}MñG¿iG‹MÔ´ï9ßÏ?8ò¹‚W¸Œ¹ùÚvy;ƒå³óÙ… ÎoùÍ@|4=MmèæCDöapê®Ýá{€Œ‰sx¼q[OÒg¶ty¬iß6ä‚‘Èv{ÝôÌç\Ï g __¢7C :›” +¢6¯‹¸¼½" l+d³Y)ûÂß …"J:Н*V)A¡¡w³kØ™›^òù•§Ñüsõhù äC_úúëßyç೫2Š… ¡½å²õ•%ã¯Å¾éFKÆzü>—± nþ߃OL¥¤ÃáŽÌ‡(· ÄÊ4šå„+’š CBi*¶4b05ѭЮÁWš1˜rì³Íli(© ¢…–üú¨!à—™‚¡Å4;}/͌ذÈíò[V£Þh°ÒGÐvkû¹ë§@ÐoÛ!ŒLg§¤nÂõã4¸ [úêz9>þâ›\FÂLçm´'½–-¦d'bª“þE´´Xš­ê"*×ûÿ3˜  j$ 2ŠÉÂRQC•»¬ÑG?ì%Ý7psÎyVr=¡LÿÚ`lPAFÞâåË!¯Ð5à(P¨ hvÎH›"Q¥Â\”aöØÁØÓg„zŽhú,uàR˜–ó^«³ %åôydòý”w±´ =_-ÆÖ*ujÐøæÜÑju ¥cø˜À$°KAS¨ÓäSy¯Š31(Öð. ‡µÍ¢oõžÄû»+ùµý‘&‹Ö‰}½ÿ L_ReðBÂùFú;7ÐÒKÇ1Ú—žF³Þá2O å|ø|MUTiš9Þ ‡ÈºÚK7;å1vJ¨V¤ƒœ”™óë*‡¢ºß`'E=ú›‹’&uXÞ/‡R˜þò‚ìí¦A15h‚ø ՅΜ¬´üð­Ãñ gºÐ´ül®of’¸™§Æ QŠœ|«ÚT”œ¨!áÆ …+³C9må9¡RçÔÕj¬:€´Š´ìZYJZDÌ.i,K^| †ëÐÊ? îÏ1á,RÑNðs´{îö<4ÿë«Íté~W¼,`0íGÑNóƒí0N;Ö<\ÃÍ£2'p£Ð\ ë3\ÄŒëœty *ï­èµ;€L‡ú TXšèߡ㾷x•öñž¿ÌëD‹JÊÀ€Y›o’gÊs°:ư+}Wóò½h)… úo=Û£S«Å „µEýÇà˜Tùø»ïJկΖŸæ2ÃwŸ­Óe«(ÉNÑæD 3 ±lìÙ¢^ƒcÆ(°+ÊsS”© -õ Û_œÚ¢B(-5eáE‡Ûζ}U‰¶ÖšÊ š<žäŽXšÀ.RñÉPVBYÝÒn×dì—§KbèŒ ë ”\5œzòD{KKUrHU P[_î®êrœÁ8˜ÆDŒvÙÙ²ÓhÒ—\FÎLåwHÝ©Y™YY…¥YIÕe…XÓö²%ìÄÙñ¶áÖÏ?¤Læò‡h¹Ô– ò~{úó%.ãúù†_Bõ÷aK¨L,ÖQ¢C !,—Ì.a®ØpíàáÚc=´}OgNÇ[Ɖø á–—v¹WñnËq7šTÕGן8Þ‹m´>4tJ­ Ó€K|†…ÑÃñªb×VÍÇè.¢âõR‹ÔÍÎFõG›QàêKï¼gXõ6=T’µI™“©,*bøÜªBÉJu&ºLç(Æ$ÏË/²cü¯£­­VëyÔ–B•]iPÆFi †Ž†(cÌØR+T»!_Zµ„féy@s»zÐM÷@¯{²'§r·ƒµÔlm5UÑh¢ÑÄÛl«¹´Ø„±ºBLâ<™Ek9Øm„Nªç¤f¬×V¬Ï¸—¼êYñ1ºä✸‰ŽcG*¸× q1•þ\XL$¹éŽ¡:û!k;ÝŽž(jèî²õ[én^ ¼oÇ{ed’t‹tmðP¯ÃAçüNáõ„„”dê*êH ³‹F>×iu2|©¬´ ºÖYi7R‡Ðºñ…BéA½¡ªµ¦õÐù+ÿÛBÁçã "Û…}Â…†Ü³˜<Äiÿj¶_¥'þk¾Ek.,ÔK5TþÎ!fmЦ±µÁXgl L‡¡N'ôí®Bó^ú®’×{™I±•? _¿„D†ÇãÿD‡wKCwÿ:.¢ _Dðú†Äë%š"ÉNZ¶W-é×»î¬ðüÍ–;Vj Ç•ziHHJjXV yø.K‹Õ`1,†V¨òŸ!pœj£ ºsgzôô‘S³ý~nþ°C©éÏâ)$úÆg›³“¾€~kk6àœŠ­ Ldß3ÌÒ¶†oF ³8k¿,U)¢S^ˆ[$‰Uc’ bꢆ¾mCÏ”P~L¿¶À•"& ³+rš[[Ý­ÔØ*ÛíYÖÄAo]Bû0;P𕽭™n©qI“È”\ZlH,Ïo…^ò“ßyëÛ¦ u:¥:›ÒI|ïÍŒC(ú¾™±X§Ã3cøÎ˜÷_Õçb Îrð÷ÄP×›Ãé´YãR•«Iü‡ ¬šÊ<»Äž ñä²5O¯X»öàí¦F£ç_{¨¤ZoIBÙX<ÛkpàT™Ôf‹Þ`³RvGC«ÍÙr¡`HÌ].šƒf¯ÀͰxb^ï™ÂõT0)ü¤/>›wž¤Fl¼\l¾ª¼ml?¶5¶™Œ%%`4Rƒ^ok8‚æ5Õ">í¼ V*µE8ósFÚ‹Šä+±¶ŒMž0 ž0 ='5ƒ£{Š» èž’ H3—@–Œ%4‡éð÷ª·¡ÈÛ$[¤ ’o£µ²Ñczk0V©1ý™ß$üÚ=KÁ–Œ ,é' lËø Yþ¼e@†îjÿ£ËÔjrÑeþ²ùàÙ‘ÇBȹ€z3è[ä‡küòi¤þÈøŒÙ•`Ì®¾'¾7bT{ø}œoñpß6çbk(efþQdþ¥ÀÎÁ~^œ ‚7Æíªi¬wR•eÀˆ-ž»üÌøœçÝŸzrzs{ÍÞ aûö¥PŠË¡Õá {’ßþÝ¥ƒ£¶ùø¡áË@Àî‚teª¶ˆÞÈ:ÉM?³€ý¶š`Vå ;dG¾W/—™è™Â¯-ÎLH×VV•Úl”,8öÕ7B q^5©1*-Õhš‚&QhÓc¿àê1é‚;( —/â¤!Îl¿[(ó<ß%®M&¥$eTå7´»ÛZ¨? ùÄ5i”ß¶ÄdarVEnS»»ÕMŸšºƒBr9(zìÔè*ÎoͲåäçÉå”ýL×ït:ôz(!‹R„÷vRŽ)òPO}G³÷Ô¿àê1Í6WGPOÞhM7ßœºuoÝþ›Ð;xœ±`˜Ú•O± ^Õ75ÿæ<¦  Žhê3÷AôøtêjªêºÆN†L–\ÃÎK§ò}7Þ[Oã½Æz’ا•…oƃ  «HJ{‹:¾:Œ¢§š¨3è}_´÷¾–þµõîrêîªh,·­/ârQÖ~›¤Ax·¥5öUð›°M{£¥÷ZZ…¦£GÐoq6¹¿8×k\³2o2>gŠnÎö›G0ÌÏ×Íg.ÌXY|•˜*àå€N§%øû]“éx`ÓÕÇTfÚ…Æt`_ÑÓBöò5ÙÀ~ŸÌ>¡Hö†GA1d륕Ö¤_Ôþe?zÍo¤Î¡«¾(Û[_¿ço]$sþGYžB½|6—ç8_þiyoÕàPYú¡;¶¿,CY˜-šã—5•N›‰ÒópcÏ(ø4ç3dæb+~‹o0›]O£VÁ†b«Ð‚ºP«*y÷ÜV¨¢Ð.^5v£ƒ¼Ë oý9Üeôl³ÞŽö*\<×äÓS¨ÉvíÚ7uLâ2bÇÄ_Ý•%æ©S»*ñïCž˜Ú©ÄN÷õŠendstream endobj 167 0 obj << /Filter /FlateDecode /Length 299 >> stream xœ]’Anƒ0E÷œÂ7À`ÇN¤h6é&‹VUÛ 3D,b!‹Þ¾†ÒEÏÒcÆö—‡úr}¹–q5õû2åO^Í0–~áÇô\2›Žoc©šÖôc^M×|OsU_^Óüõ=³A›¿¥;×­ ú©Ù6å©çÇœ2/©Ü¸:[Kça ŠKÿ¯ÔºmG7ì­m¸®!hO®sÐ Ð z"źlE™¨Tެm³h&Å¢,ŠST‘ìì)ÖzÙëÑèµÙKshH±6HªàIzÑ)Ѓh$EP€žD‘(h*¬P\ô¢ !¾eѨ„ŒŽk£¼FD„¨1¢ÄˆGR GÑD 4éÓïo,Syîã3ù¹,\VºUf9þû/æi–]T?\ž!endstream endobj 168 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3269 >> stream xœµ—ypgšÆ[+ BfG‰”£[@ ÁÃ&T‘0Ì b„m°|². ë–ZzÕ:¬Ó§,ùÀÆÆ&6&11 Ç&!³3*d™Ìd'³ì×N»föfv3[[ûß–ªúOUý=ßûþžç{[@LžD‚'6lÜ(Wæ¾¥”(²–,NÛ’s¨¢@^–ük.÷”€{z÷ŒxϘeÌœ©BH|þ鉟¡CÕ"ÍL‚vVmŒË“^\¢-SÊUÊ~±xñÒ´4ü|Ev@+[½P¶^ž•_¬.ÏWÈäEÙ²õ 7.”½]¬Æ‹ Ù¼â"Ùœ\yÁAYñAÙ¶œ]²í[×lÙ*[»eÓöŒ­óþï ÿqU^P’+?$/,”—ä*Jº¥œ IQñ›åJ¹fƒ.;ç"¿àÕËWN›NIgÄ&"ƒxžØFl'V»‰4b±†x“XG¬'6‰G‰gˆéÄLK·€x)®1™8'x\ðݤ‚I·…ÖÉ+'ßHñˆV‹N<²ó‘ïÈËS^š²cJÛ”ï§Î›:4mÕ´;©ºé+ÑÑ›´kaŒsiqúq´ö’û4[2cFo§Ôk󶾤ÎJ´›ƒqºqø=4 FÈ«ûûÓ—¼óK¥Ž²x sìM¶I[©8œÒ¹Ýq?Uÿil°ÈX¸*OÅ«vÒ›ùJFoS‚]ª­1×F±jÊÍFü-ñ¯%þ¸?îKD‡$µÃ¿ÿÈÓÁƒyßá^¹Ÿ6+]0’{åÜëEsÔŒ¿ îœy(ýÄMÔ}CÈ)P«ø/k./áŸÄ¿Yü¬yW×|ƒ¤è)D¡¹Ôê>1d«gå¬ÏݼM±Èý™·Î¶"¢ë}zèó‘Ú#@^èØ³‰Æ±Ì   t¢3Ý‚±N)Ž¡7@…ž0°à‘‚3l2¹ì•JµR©}ÈÅ¢K¨:xÌí=R$¡Gy«”à`Jhg8!ík0ìö7²ÉbÝÆÅþ Í»1€{}wDÈÉÐ"1ôhZ ‘’#E¾Ìà¡@V5œ&Û›/~Õ2dÍ®¥Š]ê ¨ õñxs}ßéý'^ã%çd®¼©o·QçL猰,U.ãS¯‚a%uÜÞÒGÈDeDUZ¨zwËHÖmôrš~:¹¿âéd³¤h§Z€®&!³€ÃìbŒvjÿìå U¦èÑf¶Ú[OßDƒ)÷D±ÄÂ&ÐÒKE=h–/~²ÞÒ1Å®\3•Í/MIK6Cc@ŒþJ”Î÷:t %·Ï9ÿç‘ B&ÍŒ<$¤ÿS!gÿ;Ù.Ça†Ò­×f²„iÅÙ@øÿºɪàZ{¥É}Êõ ¥í-j{H~ ?“žŸ›öÁ[·bCÞOGé€üXÞ ƒD¢®«¾'ú î/C¯‹wó»ìZpêuÒÌm*‹Ü}øƒ¾¡.Ü3tçG§{û¼\óŠÍæ´¹ìIÚ–;°Äè$¿ Úw…œõ¡R³ÓauRy²µåù@fWvuc`¥Ýèkâî5ú šªŠíê2('+Ú¶xWCÿ¹ŒÅæÜJUve{¨ÈÙ[xqYÒ“déîûWZºl‡ÏbvÚ¬ ¥\ÿKM¨AëWU+¢z¯ ›P fæü…ö–žN€Ï÷ô|ûM|¼dÈ`eœf;U¸GUYå`¨Õ×kºX¯ï[¨²{lÁ ëó³tã™ îÝhMXúõah…Cû—¥k*—,“¬]—»¬ò0À²a?•8ÖÑÖ ™[ŠêU •í@þéú§¶dAIý¬èà{ÿ7¯&AÏq¿JWé˜:Êâ²Ù¡Š4¡vµš(F½‰7MÐ+ý£Wp­ kF%q´<.8sÕr«ÿCì·UÛìN§ÅF­˜Ç ÀäJó—]wgíEzXÔ7Ù¡¦k¾ †<•sâM^È¿øŸ>ç£D³¿¼¡ö x6ÿÏp€: êC ~¨mr ­H‘Üñ_9‚—Ç#¿»çfÅ7® Ñø:1rn?ëƒêÖ5•X9°us[³ð¹Døð2þ¹y3®40ÑnW/q˜óž©òÜÅÁŽ`¸êÉ:ccIE¾6ë@¯úè±ë·Fk©vîqñ~«­TYV¡‘ª´Zl¨ÝúsýƒíhjÛûtÛÙ“ýïy¥æU»Å‘”¸Ëò°‘ßüzôä¨õŽ¥ˆc‡ë”%%¥%š]s¢#ÑAÇU?¹iµòÞÞõð¦õ×$.Ò}ÿi6Ô& Ä|5ÐHžÎïÝ–ÃÏ1OÜ®lj»×ߨ‡|•Uå0Ñ–Òwy²r¿©´*TäÞîÜA|YÎ &£¬MvjôëȾÐÉ«¾rUÿ€˜zµrW&šªpO½7á­£½õà…\ÞÐþr¸³¡«+Ñ<8|æäYðcß±®ˆÛÚÆºÀÅ:÷0æl0<ˆ Ööx_‡òè»Åû,ËÓ)ENvVŽþ/Ü«’$ªÊÕg)FÕèÂIýTù9ã7ÒBªŒÙƒÑÚ`ÄOù‚§ÑFK7ó›Jx ¬øf39 ÎäÑŸu®£­®7Nµœ Løþ9>ߘÍú?|£ÉÀBWM³ÛçküoßüDŒ†4†°·Ù’ó³q†1:­P)Ýr*wàhK¬§žj8ØHKÃæ ‘q‚µŠŸ¯1Ú-v0HÁ°‡í^D­ø¾2 †é‰ ù×Uhû}z+.D™nñ•²¾ì4=èI’W¢¥âçÆmò¤ƒï¥€Ro#š%ÑRž?õ%\Ø ?p‹$Ÿ9FöÁÒ¤ÊWEDHÅýü‚Ý9+ä.q/Š›U ¡ø¯D™{s³K÷0E¬7à§Î~~b@ŽˆòùéÛùéòÅ=FÉJjê,ÑŽÀ‘ÞUsØèЇ¨T‚RDyü<ó~Xz( (B™a[-÷›b~`m5tÑu¸ G`¸ú|ø‰D¢ht'™~ϘLñ1}¼&~ σï·‡…œx™Žkš,]£ÆŸ[ÞVé+o’‡< EhJÿ·ó ÚDR]Ë%èlÉb³Œ%`*¥í§šÈ_¨€ÝgÕÂ>FçÑôÔ¬ü/ø ÀïþÙß^/ï0²Ðnj²ž8 {ÉMöÁÒ’HƒŠ²ú]nv»Ãj:™3üñÀ¥ú“±eb c²g‚ ‡±º¶ºOíGÁëj°“3*â\z8E…qQ|êè4jêämÛ2S§@ê´¸›õx‚l]»ÖšÚâîÆÖôãO?›: þ'4Dendstream endobj 169 0 obj << /Filter /FlateDecode /Length 614 >> stream xœ]”MnQ„÷œbnÀ@ÿÙz{ãE¢(Ɇáa±ð€0^äö©*ì,²¨‘Ê0ò÷5­^?½<¿,§Û°þq=Ï¿úm8ž–õ¿Ÿ?®söýõ´¬6ÛápšoŸMÏùmº¬ÖOߦËï?—>à ýxïß§·¾þ¹ÝÜÿ´¹¿4Ÿýý2Íý:-¯}µǶ;Ûª/‡ÿ>*¿¿±?~~u»mÊ8â‰jMA5Vo ª³FSPƒõ¡)¨¬MA}dš‚:±î›‚ºg›‚:³š‚z`íMAí¬Ç¦ ÂjgÐcÆOÔMSP7¬°1 6&#£‘ÁÆdd42ؘŒŒF–MAMÖj j±ÂÕäkô5¸š|¾W“¯Ñ× g4 äL‚FA¾KÁ©àÀw)8ø.§‚ߥàTpໜ |—‚SÁïRp*8]NH‘‹ÊIå rQ¹¨0rרcwŒÜ5vçØ¼!æ s0„ † ƒÀd2‚ BˆBTAªÀ^„v#¸¢U*@¢ RˆBTAª³7üQSLM29É` 2 ™LA&!€)È$d0™„LL15Éä$‹Z†ä2$!µ ©ÿ ›”QÒ(a“2J%Fž{rì ¹”`R0!—L &äR‚IÁ‚\iìűäJ‚EÁ‚\I°(X+  r%Á¢`A®$X,È•‹‚¹’`Q° W, äJ‚EÁ¦—¶½¸í¹’ ž¼;_†'ˆÇìëv óÇõÚ—›.ž.ÙiéÿŽâå|á[²ú ËAendstream endobj 170 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6432 >> stream xœyXWö,evÄ‚²Žu–X[ŒF£Ä¨((¨€¢¨ (½ÉÒ–²ô~é½÷ò¡bÇQ\ÔĵF“˜&FM¾/ùϘKþç¿»”%_òåùg÷™;wî½çœ÷¼ç=ƒ€ÒÒ Á”mÖÖþï-]lëæâë"QÎã§ øüLÍÎ}c¥&h¢ Z—g¼µHw ”é‚ÍdJS pðØp$\âåál¼léÒå‹“ÏÕÆ®áÆæKŒ­\ù„ùx»ø6¶Zb½ÄØ& Œ z¿àoìêæéâënànlï¶Çx—Ý&[;ãͶÛwí°{gÉk䚢(+3󀽎l Ü$± ± s‘ºn ?dqØÆm»ûO[/;{Ÿ]¾~ïE-[þþŠ•¬šµz¶Éœ¹kÖ¾ýŽé‚} Xì´Äù݃dµYÔvj6µƒ2¡æP;©¹”-5²£æSöÔ.j7µ€r öPæÔ^jµ˜r¤6RK¨}Ô&ê]Ê‚ZJm¦Þ£¶P–ÔrÊŠzŸZAm£VRÖ” ¥G DÔTŠ¥¦Qú”eHiRF”5Ò¦hj&ÅQã(ê-j<µ†š@M¤ÖQ“¨õ”.eJM¦Ì¨)ÔV2=šâRÁYåšFšͯµ\µnk›jߦÓ5ô—Lð8Ýq!ãútüt®Œ—ÿzÂþ w'.ŸX0OÚ§k¯{krØäGSâ§<ÑóÓSˆ¦Šz¦êN]6µ“5c»¦ÍÖ8íÿêGê_703xc¸ÜpÀ(ÎèÆô‰Óí§WÌàftÎøq抙þ3Ûg*f¾áŒ¸õ\ ×ÁtLâk‘ü?rþ­0Al Û5ù¤V•$Æä$e… („'òÕñÇd¾ÈE¢x7P½1˜%fa+¼È7Læ›gÊ ±DïÊáö@N+À˜DÉ€R:KwÙOoís ÷õâD¯ZÒJÝþ„Áæÿ‰ WºÛåT|;b@ðã [L[¸ÉjÓZϧç¹ûB‘^ßµË7\3_íà' ¨$ö†ÃG,¼¿`C»Ž¬^&®”…¨¯Èò ÿŒaYÛ‰u |ò²—4h÷bCÌŒ1ëÊ—udí£Ø~(|ŽüGtªõòDnÜ‘×F[â­¹‹°Oþ~hÜ>ÛUW#Æ>ŽcböáP|ð2~kë¸zµ™ÕgÏï(>xfå"gUŠé+Î(öþΧw³¡­BÃ8 \ ! /tE‘GQm÷bø^¤+‡õÁ™uCÚnZŠBŽ*cI<Õ–TèŠޣ£”y¡´¼uPæ§ö/¦Eyíâ19‹ ©@_ë‹–ò‘üx¶:æäª=[÷ÙsG…¢Gª±†¡_à~õ”ÒeÊ(cMe‚Íù¾ï%Lä2‚*ÂS[]Þ4¼™·òOð‹fs5ùh>‰9ðõ;eÞc·D }ð†ôßúb¹•5Æ£y|O•rMÞ¦°è?˜­ñÉÙ\làŸ½¹gÛÛ~ø²Ô/0‹ËˆÈŒhÎ…*‚Rd‰iœs3’’P¼ÚãÝ_#žËÄ= ŸG£ÝŒ»»÷ÒývE%\reJQ b”á/F"IkAyFW1×ãq9­™ yYû—ç‡iå6aâêeÄö] ÇV¢OïôÐ.ÝÚ6.1ëÐ¥1ÄÃ*á¨ÅxÕz «ßâËâ–§8•^xÛãþƒ/N k¯ ¦4 …,ÑEñmlk ’qNð„V¹ùO4íE‹zÞ3‰ñYƒ:Ú9¨þuF½Pt¿»»°¹‹í÷ɨA•ÓïÓå ¨Mügš³%µÄŸÃ/j Ž©qÔ  Sc®©æ)Wªåuä‚zØûöjò©üœ¡¤ÃãÔ(k¦±?Äx¨Ý¬™4ì‘V„øE±W5ªA†U¨u€¾7h¥É”Oá¢\Pû¾‡}š|?—m BáÒáAd›:T%î¡÷â‹ÚétJcôÙ˜îð©Ež(Ž 6$5ñæR˜tÚ.j÷ Ô`$<^C6¹Ž²ƒ³¢N Ã(« RÞð4£4«–É sºð¸ì„âˆJTŒºPVyvíu0h­r¥*zwåzIX@Ê—“È‘ºà—“•À¯ððœƒs‘¹_Md}YsAW‡ò32ª3K3JPb>½ä»QŒ7¥bݽh!#е¸aõKW^Û9Ndê[{>ýØôfRjHÿ7KÄAèápFTáᄦ[»=ÞóMÌÍe½&pÄöàx™|mG}Ñ#>q8À‡h<V)QÚ'èÒ¦‘0©nMb³yëÖn©kXEDC%þ :øm<¯Ð>D‹FÇaÜP@C‘¯øÐÀºÚ!ÃA%÷”» çÏ9hË„.s æþ«Ø€Õ_<˜K‡¡PBÕ Ü?—¿–( I¹‡’Œ  Hþ……2Nâe½BµÙ+Õè딹«¯ø ôÇb©Üôœåü>¹^#ìÅ[ž€ìÕý/œoÀ^ÑîIቾ†étrU|MbÕH4hø{зÑ0 ¿ÉŽC©"$ù Zˆýí=Ò¢Ò”SP"™6„WJ8Ñ©#á.Gõ¼>EÙbx—ß§­Î!²¼¯€ MÞl³?JŠŒK Kä’¢¥ûͳrÃïÎ7“”š^sÅ‹3<«dõˆ©¯©h¹?9aÓíxÆr<áû¹ â£?U £iµÊåzW{ö~Þ 3È—¾¨ŽÏ&h E>/¶+3@´B ÎŽP{Š,>p v2ˆñˆ÷Oò'Ùwn9§åÆÕK 1v*O‰E-$ÝÚ¹A™ÐG‰QŽÒÜ“!kDŸ -˜!,:pÛgGç—¸å$æ&'£TšŸ_š•û5ä_f2iå*gŠâžŒúC•‚tt³×Ô5Ù × áôÔTgd¡ ã!HÊá´wB‚·ø€p´5B¦ßÂ=¡aé©(ÂЫUq¼.]›‹ªQ3’ô·•ËÚÑjÖæsÿ†µ—ÑÞ-®åIM,$òC,Ê“Ÿ-ø­÷dSK3'²ñ@²Ü0Gã%ð+ê´sZµnãö»/ïܺs³ÇÎ^ ó½Ú«É'ŽˆÔ·ÔÀj H§ñ6>5¦#*ë2ܬ†hàL¢¾úmŒ2å2hØ6˜ZâYžÞˆ [‹³Ž‰ùÜ¡dèú§×aª\Ot„?< ²ð„Ti"²gW|2E¦"¿aà"]S…º€Þúž†Ç/œuÅ¢.<éçyÀ‚Á¹g ÜF˜Åâ*ºô~ß•;ˆô’‚9̨îU@‰š'\cádh3¶ÆÖ¡Gð)|²æXöÚ&8ÉY°ÈmŒÝkº -G’š˜ 1Ñ·è êG·‹Î–ôµ?AQg|™}ñ~r2f0…0Ä6Åßjò–üGìõQä‡ë¼Ï힯®Ï?ãþycj]½º&΃~˜4&›'£‚Z¹”‚ÃÕuåÍÃÒp›RU\—FL æMÙfϰÃÁÿKÙ«Þö!Ìýg/Õí>h±{ R£_ž²Ø­"¥ðë`võÊuXÝïº^Ë5©ÂV[×R;¯é‹&S|.oÀÖIÛvÅ:¦{àD:TQ¤gÕé‹7š®C­Aÿã~¡Gèp¢>ò2YD ›…¢žîsÝu¥V– ¥#ÙüðO“þaʰ­“ä0)LÉÄ\›as—ò´´Ò¤˜˜dÎm¥C¬4-2=4 0’Ê䲪îÜc§¹A“¥Bu^gšaw4á‚ûf½°uzz"ÏîõÂäÙÙ‰:‹‡«z*ɬ(üIê¦ò¾Ýlã°p‘p8žMî»øòᩌèÅÞ³7?7‚ óâIXgÍê•îͱ5uÍÅÉ%ñy\ÙÙsmWóäÑå›wZÚ‹q ¶‰OHJF2Cåû6N”Ïi3¢scåyåz§¶” €Žâ9‚? æ,º»¿Ï²µ÷_ÍWÑGÌóO°OØ´Ï»AV­Ü°4©05‹kk»«ìdn_ðpò‹ò<"ö ”¤y¤Ù¦D!äÏ(áÌ¥E…¯.nÙic·mé¡uEçÅ99yDO1õÒjIpH”ϲw’´Ñÿúù‹á£äüL„½ýDç$À¾¡8¬…_éŽÄ|/.€BÉéÑaXŠ7ˆFi(Œñ.Hlã SÖcèu‹:¬z<üfǼÅ$ð‹öÚä°B.xª€tu_°e^÷ÖñtN qåÀÇ4öµ´wb¼W ÃQp{evNa>×ÔÞ]yøüŒ¹Õ‡·°5ÿJ11?˜Ø\åxÕW›@ ¦¼zšCd ý ÕO„¶Þå»?ƒ”ψßÏñ>°‹zùÖppˆpuâJá­ïŸ³šÏ›Îô «Ì“•ñx<áƒ5&¶g÷~ȉnÝaj´àÅr˜zÏŸþÈ­‚¬­µ³9'ê0·>Ó{©÷üg¯îs—â㬅¥Ý*Nd»Ê²W!¿vã»çW·Ù¨rí 8'àÅüM6ëœW~4’"ÿØ,çìl•ÚŒPNeFƒWÁÁž1dÈê~è"áQ@ýãwõE¿’àÜb! k*aÍy«ˆÛé§Ë@ãÒ¥Šî3\ž¼öí…(yd„–gçää¢ ¦>¼:PáçS¹‘h+‚ñ)àÈ­}ÄÚï²]e²û“ßÞí½wª98Œ¤%Ó~¸@ºÑˆì\ Üyw`e˜€T G¶ÓÅp–t%ÌÓ>OÖPˆÝèRætF!C_”⟅'ÌùÛÑut !ÏNT,þ„Çó´ÕÇéH¬‹’bÂK#jÚ²ZŠ3¹r˜¤ýïÿ1þ©êbl–¬r©9ªƒ)ó–Xg S°¦hÂc^‹íòkôq“øúº·¶khkãpŸÖ_ÆÈ“×n‚†7•-ìzõ¼Âs›8,ìH¹ +ß—ƒ¢™àŠÐ¦šúâ®Gö÷°N!×¥¾Hɹ ±FôÖõÈ åb Öø28Jè”ëZu17»0Õ1ÍAañ)V][L,ç®Tm­¨¡œ;&„IU¿Aw ;XÛÂÝÿBÑùó'ú X7¨Ï¢=Nû·Æ2à/ü8ú”Ú£Ǫ~˜Õ©ý0»_ÐIHê7%Q•}|¸wŸ£ÛNÓµÇíÎ÷»öé+¶2ª",(QJŠnücSJ\Z2J4”–GVÕçUesÐôfsvafÊ3¼4øûÀ½oï^÷ff];.\èê{Àá>Ÿu–ÄÄH›OwW¶–”TúbêTŽ!£M§OW5WqVz“÷üŽEUÑù±yøXù(Ê+ÉGU†uÒâÈøÔôx‡ŸàCñIÑ HjˆÈÌÂDø»”Æg¥./¯*®S¥“Ã'w|¯Çvº“Ζh™;AMA üNw(a°H«Ó›ÀÿNÇx“{]ÊÂÿŠ.í"÷”K˜‚±ÜÅ¢²Äìðb<ù«`ˆ@ ½>b0ú®¼(/›tÕùÉÕþø 6ÀxüÙ÷:÷r—ÍÚÕ#¦1§:_µÌ¿šð+ô±Æxæya÷}ÓÞ ÄH’¢ŠsRŰ Êð ¢—ç»c1ž¾4Š€E1 ¹a -pä^ÁÐëÖ‹rh%‚Ó½ßõÂ&R]‚?g›P\D*Š‹ã<}Üb½ˆ ¥³àŸùwó™8›:qj¦R–0Z­ÀÚxü“=/O‚Ù-‘x#ž'c}Òßl†IØŒŸ}uµEl!¬‰“íÁý.×uöÊÉ3§wš(OákòûÁ›E1i’ŠÍ¥@õç•ä¡*&µâðä ™£ÃÔáí¼ãý3,39Lݤ¡Dd%-J*Iƒ`¦vÄ$F'¡0Ã䂃É÷ÒÓ-‘¿a<òîè@-é§5rr/÷ê;.M‘™(1Õ%•eJÏ®’¿™MÔ„„)l÷pXôf6,ÓêZÕ¼?¶ }sãŽr`©7õwJÃGبh Ï‚Ùô¨ÐÁ³ñ,á(ÓÀ,<›>0f UT2ÄJÞ˜§ ¯Xùáã·‚ý|ÜZ$¹y™y\”õþȘ”¸ÔðdRé£Ê"*Úù48õùeW\Ø7[‡”59²ZL/úc6^4æÚrô%Ÿòø¼çèÑïªIîÒ#Gã-ù,þà³Ä¬x”˜jˆ?XãQïp´ÌÞ‚…VQõ—<+ Õ6(¹¯ÿ¯Ô§lß?Tn‡ þy;÷7óU„’Djò‰‘é%†—ET׿••ärð勼ò „ò•ûòÌkl•kÂof²•¥² ·,°Þº.÷îŽÊÆú¦°:¿ÄÄtÄ¥ ‚ܪ¬{Ÿççæ rõ‹— 8Nâï¯|ñb3ô±Öš¯ú¢Í/X4@ë5gQÄâ·­°ÎÚµV oÃ<Å«÷#çs“b‹ø E°¶(»ˆ–ë(Æs:ZöÆ¡ ã•çf(rª³s'Lè¬ÉÌÎ˨Ê(ü¨£pÂDŠúRì^?endstream endobj 171 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1372 >> stream xœm“kLSgÇÏ¡PÏo[Øì¦çTq™l“‘mɦŸ&nº-`¹ŠEJ)4ÚRZ -…–CyÚÒ ½ÒZÁN¡jË5ŠxÏ&[¢Y\¿Ì̹,ûà9[]ÜaY–˜ìËûáyß¼ÿßóþФ¦ (оz¸ @ ¨ÿB!ˆO}¼‡'µJ²µ›7é7Pz[ ½zšþ#? 2X‘º´-|™jÛBÕo¢ª7#©(Ê—¨;H›Õ2±¨^Á}?7÷ƒ={˜s/·FÍÍËáæ N5JÛäb® ©–›ŸSÃ="mcŠbîni·FX/Ôq¥uÜba)·¤è3^÷¯°ähQvÎÿ²½Pl#²®I®¨9Rˆ#%HR†FûŒéIE®£ùèµ!+‹õgªšØø<Å0‰è£4EéW¾µÝcÑ4••éê±t&ƒ¾—ïÔ ëèqE"ΰk”ðOÏPëàöòÀ>~¹° 7,W—‚dЉ¼RÏÀº¤ÓksàžÅàÍ8`cvY«ºWÕÓ@(÷Õ%ß&;2 9ŠP7è÷x¸ÕîŒÙF"?nµú]ÓV¿ï*˜#‹ó3+€MŽ(+‹I¶ªœÐ6€´o^šxr‰âzñÏÑÇE ÿÌOÔ®ÓQ”Úv›ED½— «Ù¡:GÅ`­âX0p÷—é ]-~\A*Õ ÃÔmØÎ={'´ ùºàÝR=ˆ¦¤xD転?o¸®>´¨¤ª:yyÈáЀìâe‹ãx°³Í]G®øèá#*oŠÚ_£Ðýãâæ êxJ=b,tw[Œ]ýd§o«(ûô`Jo"du[½Ä}*‘ö„ò@ȧ…v"—=Iíðƒ€3ÒájšOtá’䯴wØ*-¨4^«ì¤Á(ë® §pQ¼ôô6µÃç|Xùïø߳賌°tèt&£ÌˆkŠUüZÀÝ¡h`0f%FwM™íƒÛiwlXDåÔvÊô’^¼;Д`“éÉ×’DrwÖJჯ–/‰àÁoL˜ƒÈ´30<é»XRXŸYv¯l¬J¿2æix†øòöb|°¯Cy:R–ml!´•`ÒŸÄÂã[Bÿ*U°ê¢ã©~fÑáBÖö9¯ä` òp|Øñ]#bÔvß•ó‰YàØ` F4Õ]¦Z ±Ö@g8 $®ª«6Ô*ðÖ%~¨†áF$·H×Rç±Ø§XŒBoQ[¢CŸý CO%vJ8‹ÒÁÿÀj×V¶|^ X‹1|ÆköØ"„y``ÜðpW°Ô1ŽÅ<Þ嫳S àOŸS_b€ Fu­3g×bòɲcüj?Æ“uu~¥³¶š-VóÄFêHIŸI‘­&}?¨9xÀØÝ¦^5žÜùì.Ù &3í>M(æ÷ àóoÙ¸¢z¡×¤ïÓš4Ћ9y#>v.äÅOO ÝûÚPjv"n%~¥ž-³èßè·2£2hÇ“±• „ò ‘HZf‘ûœ.‹ÕiÇïÝ„`7ØM;Ž'7Ôå:õmÐ)ú¡i×ôÃ|…r¦QëØÊ\õ~ØÏ€t‹¼WO°p$tÚÑo! å\çf±˜-ó°Íîµddœ³¹"f‹Ùfõ™mäoò#©wendstream endobj 172 0 obj << /Filter /FlateDecode /Length 335 >> stream xœ]’Mnƒ@ …÷œ‚ð3‰'HÈ›t“E«ªí†a¨X!‹Þ¾Ï¦ªºx–>†ñ³=.Η§Ë4nyñºÎñ=mù0Nýšnó})ïÒç8eU÷cÜ~ˆ1^Ã’çç°||-)ÇiØù%\SñV5ÂOÕ~)Î}º-!¦5LŸ)kËRÛaÐ,Mý¿£ú´ßè†?¿R®q <é.XWJ•%"'&àɰQ ØvJ; CVÇìˆ@¤qLå,•«•Ö†N) •áJ†G¥€GCQ hE:¯Ð¢@Ç"é‚RÀ`Ø+쇨TY"f­ÀDh$f$0‰ L„FbF‚օ틵/H#L%L¡‘˜‘ Jñ0­Ç`<‡ãm8“𜆷ix”ïÙ¢½âã¹ìAm5›Çûº¦iãþp?l-Æ)ý®Ø2/v+‡²oÍɪbendstream endobj 173 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3219 >> stream xœ}V TW­¦é®B”²Ä©îÌ8\ub5jŒeq ²7ûÒ¶€4²5ýèR@¡YâÔ QÌ(gˆã$'%Fãe~1Ÿ3N¡Ñ9s23ç×ùçüÿë¼ÿÞý÷Ý÷D„¹!‰l7xxÅÅǺ¹:{…†§(‚ÇwßæEüt3þ7bÀÜhßè^ X‰Áʼoºõ2[Ô9©lß$B"m‰HHV­Š‹W%F†G$Ë绺.pvæ%ò*ùJùúàè8eRt¤<8v§|½‹‡‹üã8¥°)wŠ‹•ïV„ÉãÂä>¡[å¾ÞxyË×zyúnôžåò+ÏÞllŒˆ\LÄô¸øÄ]BÃÂ#1nó,\ôλo-^ºÌiÖWJ8ÞHl"¼‰m„3±†XK¬#ÖÄÇ„-AS†˜JØö„á@8,aAL ¬ˆÉ"­ˆßàæDñDhö¶Y¾ÙÏbss“ù°¤TrSºEú€\EÙP•"‹÷-.X¼˜°~B“¥Är³å U–Õ-ÔjÍkÔFÞÕ jBÍCb>E1hÊÌ<OžEx2fžÍAhⓇˆf—0¾))Ûc·AêãO$ƒ‹ÐÐWìð‰“ú.8Ÿ¦45Á&¥¬_˜Íá¼Ù„æxS†ÑvdU ÙÑ“øCHÁ zö#l¾,80EÉôOx†Z¢ ¯çÊÆ"ÈíjXÇ*HdÎ!‰Fb"שḠ½G ÷§õø~²|ö1²ÅSñÄÞu ­íŽg3ôPµJ"é)§›z›N;^½¸KdÖ/Dù&L¼Ä¤6ØŽ ŒÜ²£å<ÁOfZMA+Ã×e°ÈŒ¤±l܇¯Jr>‘aý¤\œ„.ƒ)•t/(k—!’vzÔsç›bhu¬F«Ì„*NŸn8d,oa…Àmú…ëÀ„ú…ɶœ/´£5|ÅTIoô•.¹ OCîöÍGöÖ7˜Ú»+OR&2¡ F›1°Y·§R´\_P²'m¤eíÉËõXf¿ìÉÞRÐA‘TV¨-¤è ‰ M*øÆë·¡P{Òófìý=¡ÀßËoÓÆ‚T,5èL… p_c/Ü¿"…Ë©¨œ†¦Ö‹þf¦}‰º" raïÞôx-Ek„h î0tj› ¬G%BJ%?ßd‹¦ß ¹ƒÚvôeþ[TÆ$JÕ¿Ï8²¨%RÚÕ¿ ¸UÆ7“Gàà}¶Õ$¥4á®°Ãq',ƒŽRÔ“ôÕk:u¸l¬ž /P¿Ï&)øCRáYzµÅèÑÊ—DÜ; æ K¦4[—·· 7»€˜áY° Bš“;b>ƒh§P‹ÔÀþ‘ïO‚Ô¼Â<íùlD"ëãH\#û908KZ„fÝ4êçRì¸sœnÜ+ …7K "d>ðÃm1µa:ÂZ7ðÎæ·XL¾§ø_û?ïþ5’š°¢È¿}öÙ1®r*ÙÌ|ÕH¤’«”‡›*këY!¯ðŽ:äuþx]U‚ºÌ:[´àk†MªyïÄTg¶ìTæîfi¬n æR]Ö¬y?ÐjL•íIWEA(*BMJÏÝÑAB­z䃬фg§¯·eœÞÚÈnnÜC¢…9…ÑûRMÐû ®º¶3®[SÔ½ÁÁki‰u²ö#íûEÛ©ŠÓªóóÔIí®È¬*­)®cñjL0¯NOÌÎLŽ j!<®;\ØRi”Ñ—Ôå%u]Ž·af² ™Y2¾«·Íz{ÍéÏOí8Ʊ¤·9,‡–é­¢‰Fl¿ÿûÒ;Úˆ@àû‡ùû;e¼˜¤¿ÀòñÔº| WH-È͸6h+8¢u í}ø'Ìá䆘He\b|]Bó‘ÚF#ûÚø¨H0n‹Ä‚áT2õ=àÿ9ž³3ÞäìXõÃbNbýBìîû&ë‘Ù ÿìèÞÑ>ÁÂAm3…¼I¸&E{FuTí&x=w‡fÜv/Û+Á?(΃zNÒÅoý7apÈüßâ´¤{Ÿ]9wée¾^,ÎøŸý÷$q_;L—”"ÿ1ÿîTS4é¦)ëñçÉzÐ%³-€èñ„®… p¦«$Ã5™nl´BÚÆÝ†.a܆6 5néÚO×КçOL¶§ž?|Ãvô?x_´RÈÛ¼˜œÀ¬ôœì!(¼N:ò3rEl\u[ywƒª!"»´¶îr_Çy †?]ºDF_†?l{ÏÇûà({µ ‰âI©poJãD¡uh“/"äòCÌ å |·áúïôß>ÿ|K}·àÜœ·—{.2ìj2ÕšNùC:kê¨hªûlŠ[fÁ¦„@YŒ_¤&Q›­M*Èlm޲(u1T³Ç¤ßu¬…§¯‰ ZQ}!BÖ–g2ÀQª=¾66):#ÐõÞ‡H„¬‡‡Ÿ²/QEÓL|ŠëçWÆëÜÆ4“÷@,JÛ«Ìl÷EJ¨fá¸6¹³© i7wz„ñ9tk¨×Ù›\mb°FŠ4¼…äe¬Èìáœ!´Í€ì†>xטjà”¶§¥ÞyçbîØÑS& ˜0ÈrÉcLø¥E„³h ISúÜÚÖœGdóÕpE‘fŽŒ¶ 4§QîýD¹NHX3"ŠýõÙ\>€°>ê”Ùi2ÜKª û`±Ž+ÚÇ–Uuôý΀1 DU¦Û)ˆdx&'í K¸ëõùî ½b…–ã´eŽ­ÕÆúúÝÆ¨Œˆœ­·_48™#ê顸¿Œ…ÿmÝÐp—Ѷç.r¿w׎^-H¨Òó`ñÚ°­~J¶žDEhRûéúžÜH›Ûõ醪æýŸ-ÆS°#fp®EÔê{2ú,ßÿÙËÜ ðƒm»Ãc<ò’aÄôçVªN 8D]oy|·êx˜ØCa°>§®6•¿u­Ex­ÕqT£ö Ηbk(¨È¯¡¥Qx‡Ä(åªü±¢¼¸è:T@ˆ›ãùnØ1 Ëà÷Y°ýÄ 8^Êž&á,w¶¤o_ÝÁ[ǾDŽÈËþ@¹PAõÔ/²2"B>£ÎLkü¡„„xUÛ9æW˜^˜]¥Àí/¬¦:±+Ó”T›”[ŸÔÔT_ßô ®Q£¨ç”þÒœ§÷{ ´«‡öìÒ§•~ÔõçŽÞ30@ý0ÿ ×™KÝ]Tºí=þlYfG¢q÷¦ØEÞàD½õtÝs$¹?ôwv5zÊ€×N?Ï<é†}@sþ¨¦.^î¹rõÒ–U¬~ŒaÜWlY²hÕ—Cç[.}’E6ËwŒ^âFD·FÄȇ·þµ³øºù¯x!¶è'Créu†¢ÇLí.È`ÇH3vRY•2þGie ÔÊðfsá,ûQšþêì Œ =8~&øó7«Rÿ‘®=:/F7qèvWãÉÈ6mä håQ´Ù ÉãðsTq>—›å¶ÓÙ­Ø,‹Ù]V†'žÅ’~lsk})PEû¸âÿ´ŽÒó=ˆcàºMôAOd³èrP¹ùù¹(¨QÉ:}¼> stream xœ]”ËnAD÷|Åüû õÆÞx‘(JòÃÐX,< ŒùûTvYÜ‘ f¤sª[wùôòü2ŸïÃòÇí2ýê÷átž·þ~ù¸M}8ô×ó¼Xo†ãyº&=§·ñºX>}¯¿ÿ\û€úé‘¿o}ùs½Ûê§õã£érìï×qê·q~í‹ýjÕö§S[ôùøß_/§ÏW7›¦Y­ðD´¦A4FoDgŒ¦A ÆmÓ nwMƒ¸c›qd<4 âqjĉñØ4ˆGÆÞ4ˆñÔ4ˆ°Úô8«žˆë¦A\3ÂÆdd42ؘŒŒF“‘ÑÈ`c22Y6 b2VÓ #\M¾F_ƒœIÐ(h3  r&A£ AÎ$h4È™‚|—‚SÁïRp*8ð] N¯‹ÙÉìàu1;™¼.f'³ã@\‡â<‘‹ÊIå rQ9©D.*'U ãPÏÁžD!ª U€(D¤ ”*6Xl0„ † ƒžB]» …¨‚T¢U*@¢ R%zJu•ì*A”¢JR%ˆRTIªQŠ*I• JQ%©D)ª$U¢¶TuÉêG:îäq'ZL5™l2ŸRH*$ðS I…~J!©ÀO)¤p—S÷9yŸ —z.ö\+  r%Á¢`A®$X,È•‹‚¹’`Q° W, äJ‚EÁ‚\I°(X+  W»t½‹×»àZò-ú\K¾Eß‚kÉ·è[p-ùâÉ5ôµo¸‘¸Û¾VÙ0}Ün}¾kjÁq¯çþoG^/W~5`ûF~endstream endobj 175 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7409 >> stream xœ•z xTEÖö ¡¯W@\n JdQd Q–DÀ@ [ö}_:tzKwŸ¤—t:ûJö•°(ÈŽlP±Ãæ 2.DAýÇÑ©ËÎ÷×í4Äq¾ùM7òÔ­[uêœ÷¼ç=Eœ¨¡C(''§1kÖ®‰õÚ“ôÊ왂C“£v&O¦ðnNü¸!üsÎ 8ýþûÞ"á #†ž7m‚ ¿|4j…¶?M9;9ùG¥¿—ž–äþêìÙsfÎ$.tß•îî9ËÝ{çîÈØÔÄÈp÷1{ܽg­å¾.6• †»O‹qß¶3*Ä=6ÄÝ/x³ûFß|ÝWmx{£ï‹³þ­m)ŠzkyŒgìqñ+V&®JJöJIÝ™¶kMúîµ{Ö‡ø„†m÷õ‹Üµ)ZòJæ«Ò9Y¯Í7Á„‰‹&-ž¼déëÓ^œðÒ¶ÛgÎz™,7z›šHùP“¨õÔj åKM¥ü¨iÔFj5ò§6SžÔê j&µ•z“šEP+¨—©•Ô*êj5åEÍ¡¼©×¨¹Ôjµ–šO­£¶Q.ÔvŠ¥©g¨ JL¡ÆRåJ9SC)7JD£hê9êyj<õ$5ŒN-¡FPK©§¨×©‘Ô2jõ45šZCbE¦kœ¦8Â1:{8_š%¢Dµôú»'bŸxÀ2Wž” 5Ì:|åð##ªžrzêìÈ#?µcÔ¥§#žþ~4v)aãØž©ß#Ó3v ÷,×âêâêéÚý¬ï³÷ÝüÝîŒK÷à¹-ÏÝ}~Ñø¡ã½ÝŸtßõ¬2^¸4ÁmBè„C7N¬™ÄNòš”;©gÒ¿&OüÖdùä¨}$_ Ö¿[ùRÚÐÛ?¢·y]‹8¿Dc‘UúdÈ„p¾šÓî—æEA H 3?¨á¤*m¶J‘£ÍRG7@0£+¡Œ-ÆÖT…CçÐ<Ú81RA媎®ƒJaN49 ‡6‹1G£aè’Ènº`õ³ºüÆülcÙf¾´EllM 2Aô”YñsлKÀu5lONcX[›Q_¶ÛÍ“–@Y^° ˜#´?¾ 8ˆæÐ¥ö=û—kA+Dló½ò/öŸt; …±9oãTnOÿkö×f:^cú¬K±¢@«Ë϶ØÐÛNbä{|Z,.²…|´´ê“ÚÓ§,Нn»‰Á)´âA­Žª‡r`é…¤¢¸A†éh6‰àzoÉ f':$VîÚá5˜It ¡Ñ4Ûó­UG0qø€X±u«Ïkde–ÞRDèyšòTz*ûTVô«(J\ƒF¿~áã4-NÁìg3Ð>Î?Ö fU8s–‡ÇrX[¯—Ý)ûîÓ.Ã8í9[XLfåÍV§ïlèW›3_ˆ–ˆMí‰ 9‰¸2&ñÅy‰»`6¬ú­M¯G/þú[/0ݾh|^†NÒ ¯1TïEã9}¹¡>ÒA™£RjrA›‘Ó´³z3`1`7ül4öŽÆoõâgÑ@ üÜ[ö­°9N°¢—­è =¶Û>›Òö+ñõÓ_c?Ý(ÏŸ^€HßŰ“¨f#”ÿ¬ŽzõAÓŸBa•T«‘ÀÁ½ ¢;Ñ®Ž‡ämàŠœ‰~¨A,³r ëI½$Yä½Âm)¤Þ2+¾Ê±£eç-—N_t»ïyf¾ö˜½×¬.ŸÚÈVoÓc•|>ö#ðM𶕾ß±UzCm¸[h2TÁÉÍ! ì!6ƒÄ'?}c:‰Ï'pª«~/Ã>Å‘¢­t¦`;P!´˜.ƒzÁö™ü±|Ú… Iü6õ”}[vû¦ís`Ø!סíu™—¯ÉV$¤S‰ m±E£ð¦Câ²^}1\à 7E“š½’ÃÕPÉ"4–VîÒH:¡ µúªò;œ¾JO&†V¢ÜÅà±”A"¤¥Ù£òMš´ÜäpíC¾šøÅØšk æÁ“Ää>Ô7@0-vÔG?2ȧۡ°ÐØÆ<–õh¾ I¿ËNãòÃÅújõ; `3¬N÷ZcêàX[«‘¬ï†‡ ôÈöl_4ÈM¥ÄM}ÙO¸‹ÁÎ4É;íûòë?¢§Ü4‰%©õP {Ë "„ jóRÛƒü1–½Ã÷ð*qñÕ¾“¹>=ðí4ûál‡Ñ,GŒ¡÷§÷¡÷G×ì®ÕØ];®o–žîw,ûuŸk¥6r±¢L«3Ÿ„F‹+þŽG×D½Š¹ƒWqÁCCWëðW(ŒÖÅk3t­àŒË·ç`"¨¤定 H¼BªB%/ÿ’Ñ+=¦¸‘%ߤ Ù1¶ÁƢ쌶R[}èLç4’Ü„(„ò¼Ê®wCOk›½ ïýÕ|¬(Ð+:lu鵡tÛ.â6žoGJ±±¥ÏõÆæ: ݰm,‚õˆªGSëÑÌŸ~¹A¬=Ÿ¤Ã”.ÃÝðþH¥,%<º%¤l'à€]°[4öŠÂknbW4ÎÂÑ–:’1C“s5©n,Óçc†}³ -©ƒ½`luísâ'$Ä‘6›Ÿí14@.b}¥¡& "@¢É­õÉI‚ס𔡞awDrZ00œ¬^@³LéÍ¾Ô 9¤!^"ÃÒ…¢×ú‘P/ í½EïÂÉKB¯‚ë5¸õnYo_4ýÈ» uhÖ^4k,Ç—¶Ú&&~Ýt ÃEì‘W2dGº-S»±íÚû0óþ0{.”¼ôQ"Ùû¼k9Ôİ«#sk Òí*].©µû¼”@KN8™÷êm_Ü(ú&/!jP&í˜Ýä¹döÀáýŽ×„*Røa¤” -7ÑgþC~ÒCRÄOÄFçãë~躨i ÏÉD p¿c[èsøŽ)¼jÀµŠÄ·¢y ï¹–‡äH6Íý´:ý|œù+üdâßDRˆü.¬E6Ý UÀ§§â“" ê÷Ô‡uEaCrDš¬V®ÁÏ+S­E'EÇû…Myúø25ÐÜË%AæÁƒÆBkÓóoéK j™<:׿?™¯(̨„bèS¹¹1¨—k!–÷¹ßŽ…ËVv_#` xy'ÈJý>Å]Þý%ž;`2d{ª£«$uäøÍ…]ùæ¼¼êüÒ¼’–ŸÂѨì7ñ æ¶H^bXÙJÙ)uÁÅ‚S­ ëUqL·ß­‰ðÙÏøE¬IÊMÙ™N&fì …ÛZë0(<~» M6ô²KÚŠÇ ­Fò¿éhëXö*¯íGÇnz š‹Æ£i¢ƒ¤˜6>†G!­%ã³§p>?7Øwví;[ߌøGë }OÃ/á¹¢Ý4Û<àz²)ÿ@£¸Oð¨XHîÓ’v(9}8hòš‰œ;l‚nùƒXhAÞš-ó˜4©¹)àÚújc}Ÿx\ H^"Bú…€åêုÜïQ=û¥YI¿åÿòö/ Ì£zzɃXBûSx²]ª×UÓ¢Þž} X—èÏøXQýóMAX¹®\[ DoÚOŽÍÕÓ#>øôô ¡ù8>¥Ãé ×ä¤Eoö•Ç‚xÐ~Í “t q³©« Ñ?á1€‡çLMÁ£¶ Lýr »!.|KÊ64AŒ«è†«Ÿ¼ß§à\‚bR?ÐhBE›l¶•ß¼nCþËîâù3bË‹‰å‹aÞvékòMÜÔAŠeõÏ4kõ”A½n ˜B³«O¡ "4r:òÄ#iv²ùhÉK¤,ºêrõ{:¡êËMÛÖX‘ÆêdïI’Tñâò;>ßâ'“þ‹Þ‰šM·¢5B§LÈ[ß–Ý!D­Øä·ò%!ä‡Fôý#´®”o²fúhùÙ÷?@Ë>ˆþÀ¥ìÜ!›Ä¶‰èÁÃ68·Þ–rÎÞb^æ9±a¯´u#éw·êüÃöÒž"idÕv·™0ßC:O¹£8¢(-K’•¬ŽV…Y ²ÊVieÒ¹?¬CÏ€ðyâBéW¦.ù‰mŒ¬`Oí+À¬ ÊüL÷œRy©¾ˆ·œ¨<ƒ¡ÔdaXw6¿#é¸Ûmøê Q‰ì«>Æ–Üæì¦½Åu†Ò¼¼¸Z¥* ¾˜°ÀΤ÷óò‡~´ð4Ã~üôYËÉçÜÎ@Ç6rÒc‹•A wL…©°êÝ‚Ãúʲ¶Îê¦òB¸J6¥†ö’š™s±'°“ýÎÅù?Þ¸´¢uZ=…@ý7w.å÷¾Ø\ÿë—¾¾ì´Ð¶Õ6£-˜L¯Œï¼#6¶ 79ÂT´N!É€X0¿'¸S–‹ùfõ^EsZMvÑ•®fkÁ¡Ò¯×ÞÄÃÆV &‚¾<0ˆ†Nt¡;»AWL7ÆV¥ä&+wyOɼÕÑ¥‘ ûƒ,º¸^Òáv:?.ØÏLE¿ˆ[ýÖÏæ û›Whökê6tø(ú3ôÚ=¤·eÝËÚøýÊjÂcòO”„"{³‹Ÿ”ÇŠmvÚF¾VlhJ¯%¾ˆOÎUÇV&7A4ÔöåŸýZÇås[¢MØVƒ‰-Ƽ#/ ;_àQ¹´’Û]Ùi>Zxòì±Ë€†nf^”.Ù¢ªv´“µˆsôd‰ ÈÈŠëô/&•Õæ,Éœ'[ÝéõY"rŽãUŸ¥~ñß䳄`kdØšàFý;ù•ùù•‘ŽÞ2sŽæ’aµPXZÚÖ}Nò¡pôÍ­¾fÉ¡ªœlr¢© FË}øs7G cػٞî% OsÈÕaÿAWËwéöv‡£]l<"ÔáV—€¯{7 €uä/þäËveO{ð–þFјA›Ðô„¨³?2²V#yê†g DÛëÑEc<ã<úÕqï–·›¿•&ÔÔ7ΰ*JMž¹õ_5÷Q­ÆDá*KIm¥K¿¸}MÄÊ©;øe›Cõݾ>„ö°ÇZ3ÂÅh± ÉHîÿÎßèoÛŃ™xþ>ÝÝÃß\7ï©Êœu4\ veô'/­ÇwSñ¨Ë/ß×{ðËíj4êºK^û7í§3ÕÒ/QÇ<¦ð«ƒheL_Ë)4ü¸R|Î'UŸ@kдƙ¿÷èd“ûm¬!˜ÆÏàó\ò¦ÈeÒDÅåuê*4]‘¼+×éP|xeyPÁ‚Ë¡™h÷*(ëB±|%·¯¿¡{x›u± >cÙã|eŸ˜ …CHÍé«Im¢aGVØyGBe‘ÒØd†ý¢EŸ én‘ö#)Ï…:ä£"oõ×?aÉ´Šc÷–?zÈm/eȼ÷`)—ö8§^ÿà e½d:üÓ…Ó,°¢Âljô›òä€Ýô¦}ÆÖF4—3Ômiy¯¾¦ÝX/0ƒ¡¾à Á\·¿7¿LPc2Ô M‡„!²"çhUŠ-êØÌW8U¨&3X²'s‹Žp7¤¨rÕÑu: 4è¥QnŒÃ‹8u´"ðhÌþ¤3Êc`o¼¢e¤LuAo9nè|ûA3›þ†¯èã&×4Pd+³ýçm”¥jÖ&Ñ¥hÕ±¹ ê2²wL'÷¿ù`7{çŠï9Ü㌇Š}Y~±©3LPÒª0m6¦_Æi³Ua?¦Îüb‡a$‘øãÄCbCCÿ«&MË`9ýÉID]?qðJ÷ÙK>¯F#æ\Ç#Ô£Y ¥óT! ²  † CS~±¶DQPûÞéÖ÷‰¾ÛöÌ9²>ë=ü°¯ãd •Z#uü{ºýX+Ø(´Ùv–XQ†Î 7y9˜‡ò º›ÐbÎÐd>²­9¨a­! 2úB_•[ è9­*T‡çrÊÝ–ÈIë"s¶ércðJN£ ÅS´Ž(‘+àø©ºù‹|“ù„±©ì[δO_¶¿ü@Ù±¼:GÐׂù¢­V—K½y½Dˆn#ÑŠàMÈS\|9äüº– ûºÎž)¹¶ö~x, È^©Ž¨•VÛý`lÊ/͵hô]­—¡˜Oàp¨"PŸ  Õ®ÏÍuŒƒ!ߣÙ»ppuÎúœu«×̆ÝàQ”~Ôd4“FÅP—Y@$BB¦:2óÕoÖ£Q€ÆÂÏ·‰N$Vòrô8¿<»\B”„R­P…ÇÆH¤DS( eÅ9%¤oƒ(IBFRfD²&]+)–ýŠ €¬ÝÙÔT^ (ee•§t>h-o¨¨-k¯ÕW:¨€²òÏ´~Ùܽ½[OÈ „¯G!»”&¬ojW™ Tbi‚E]F*>ˆÿÉɲtZMª*¬lD92UžŽ)ÑÚA]=°ˆ­¥YïJD¡â@2^Ú*Æ 4ê@õ¥ÕŠæ ®"ÉCÄ?¯û‰ 0 •Émh‡”ƒ®Þj…Ú*WGá*N“ž›ÔFÒÑh,´´·®<7¡ÝSæ-]¼èíù¤Ð¯5§½o2ö±9µ<˜Lˆ”«öH\Y† ˆþ¶ 9;ð1äzôÝNüJb  bBŒž½xøƒ_†ÿ®ýèDݼP*3¨Uj•ŠìŸX–Ú@ì#m}‹ùxÜ™éÄÂgÏÂO…ãÀÝ8çžç]û•ÍÐ/IŽ‘N@:wÙ†7À¢çXUu¦ºüRËÛ‰Oá xguÖrÁK Ž˜píQ§ˆÿJkÊÓA᛬ISîäúiŒ«ˆŠB4Þ×¼‰ãÒñ­TÑIr¢ªÈØ| u!oäyùüÞÊü|}éÃ,°¢íV—«6¥PcÃHL·gAÉußó+j¾lúº¸‡ÁAÈGìgÙ¶Ï|Ò|ìýƒ-ÌoÆŠå›ý·yÉö¡îìÎ@Åfæÿà ߋ‹>Nh &j"*V®Ž- ;Éw¥e(TšL¥F¢Í,Ψ€ZøõLj/OЄ HsM¼à‚ÄÝ!‚2º@èðzŸ?+.¹Ó[!`}¶GÖÒfßcpŽ+¾Î í]±¾2›5rÒ”Ù¸ßWpªZ§Ô¤•HªÈo×¥ÒTÄ»Þ_Å™,zc^³åÁoâ’kqç·ÀØæ“µ<{y£Ï 8GÏ_c°ž7‹AI±ìçÙÙd>l:´·¥ÈO´j‘î̤{NŒË&˜•66ÞÛXLðV§²ÔïÄú*™9§[‡zWqA™Y_åjØ›Q,!QÑè$rü¿x7—£ÊThÒ´Y&Y¡ÄÁ\‰<_WHjVM±a¯/þ=7{œø£¼ ÉœáÒ ß¥¥by»rôO‚Ùv³ñx™!dþ'É„2IÖe¿wI×ÜÆN»}åè¼8¿DU$/À'Q0—]¨!²M)Ù¹Iš´"…E‰,Ø‹Ã=Ø+[)Øçš›T‘]N ­!¯¬§ÐnÎb*%ç±(ÜÑxlç—© ’b<äËDäJbZqÏŠÆ£¿«,2òËò̺êxˆœ‚¹¸0o}¥qË!Ï|ë€i€Âê<³}­oÈZS‰qÕhxÔ·q'v]õîN$2$'U§Ðf*4;eã¹2oãñxú쌹Z›©Sä§ÖÓ (qï¢Bûb†e=xŠë+d…ڼ䊵퉥hØy®¤ ´@_•g06ï<î ÎÔPü±±9¯ÐÔ!¸-B'WÇäxiã_¼H¼£%i$éšLMšEU¬¼ëÃáa>YJ©J“êªËUÇ4î ÇÊTñÙ^ê\Ñ.D¤=¯ÐØlù8¿¡;<¼úâÎ:I>˜¡Ê+û.GXïO$á¦þº2ƒFCîO¡ƒJ¬—£Äbæ÷·8u”!§ƒDÔëq5Z×ã‚òz¶÷¬'ß±¬‘ï Nt*ž@³Lš8@£’~0O‘g“­Ad¶y¤ÍV“!ÒãËÖD䙃ˆóÌZ‹Ö„£Hfi,êŠdâ¥ô M:‰FN¾ Eý¾ŠÓç3jÉ™++Їpú¥^l±F":,6Z© ®O Þ‚‚Žhä|¦ yä1tl§1÷ßzØþy jÜgÐxÈïäl3{=¦†‰ÃœìiðÐI—:]~ü¨õüA1žþ™R/¥Æ¿¹$8£Ì¿«ÌÍý½àÝ–Ù~*²Âõáén]ø€¿zªƒ²’!'S‘õ`ýï+¹‰t MzqF5aEK™¹„_%g)σ¾Ôèûubø9q+Z·%*HøÍQöß‘‰Âë>Çc…ßÝ!*jz¶y3«‹Ä xÚ<> stream xœÕZ[oK†W?Á@KJ/Ç;ôý’pé€@@d‰û»>yw"âê,ÿº¼ýáìä·¯”ÂJx³³«“´E̼˜9ãš Ìììö„ÉùÙ¿Ak|Ikdã¬ùÙ›“sö]÷zÎn”<°Õ¾k»ÕúÃ|¡”l‚×컹?/»œ/ˆ0(n|ÿÁ o=»/8tí~I»5V ûãöö®x™MÐÞ³}»_m7ù «ØÃj3¾þáì/ÜòJÉ ¯³äìÕ”n®áZÙ+÷b¾ÐJ9vvS±,DÏÇÈŠGeŸW•W¥¦ó´»–@™†;ÓïþÇ\ú†ƒžµ—ÑF²·íuÁJk¥ËLÄ,À Ò…²¼1\Ïàæ­Í’ü~¾0R7!HÖ-ßݯºå{ù®ºgóüÎ ö«þQ²öj¿ìúŠÝ´ïW›ëž‹e«Ínß®×Ë7=‰eû›%}€\±»ö2 ›,kš&*-4Èg=9ûM-ÙÛnúB±ß-ÆW$é§#?!ùŲ'hSØ@ÀnÒÑ LÌŸÓ%éò-o´å!»Âóä Õ~ÓHÅyï,tt"ªØHÜ›O±I µ¹¿}=X4¶½ջ떗«]ôiÁ 'åðd–½^íwQÍ…†:5[ 6$¾çâ‡Þ*úNøD´‡Ÿ4ùòÇ»hõÿµ!¥úˆ!Mð_Õdáa4üÅÙ\© BKz§P†ÂO²Õ54Vr×ÛûÏF `=`ŸÓ€­ím qn«€tS|h÷ÛnUÁçî”ÉG„ÝDZØ G[Ù.9¬è‘+±è²@Þ°ýcðƶÝ"#NèÙÆ-7D,n„í8,ëÕT?…ãéy_©zÝK娮’¤[å ý“û¬¤ØÞ÷ì¶MÚÃJùaˆøäjÙ. 4emtœÂöëõÀ‚=¤Ó`½6YÝB„}ÿ9i›àM5†²H¾û¼K[Xð-%,õV<(Gž¨2­h,웣bùc{¹O‘Q»¸;!C)Çh/C ¬Q\9¹Q»Þ‘6:8ÝhÇ?î}Û[lJ{ÈÝêk…IiÙ™Úo~QQ­ªwÙ_á!{ºÅÈÉäáQ'ì–YbëêÍuÛ]y1‚aÉ¢VFxBä" Ûä’–û˜©bÍŠÈå]P€*bÚõó]>,h¶‡/U ¹Žˆ«­E69íY+¶jêð8Í'…‚”9®¸S¯³ÁP-iYŠÆ õ⎫hµŸä›r3ò5žïÒXªr Õ=á†y#lÌX¦„*}¬: þà©NÒ…˜ŽÙO§.È7ñlˆã ÕyŠOù¹ír3íçÆyqìç’y>™æ¥lô„M Bå]:¢ÐÆF rúWöÑe2'w€âr¬¤^MiN݉Q¢—®wÊB«ûU1® „R^•SÙ¹-„p%ñÀÿ꼪ÆUø˜’iU« %19VÍäªM•ùhº4L“+ëi—+ÏuՠŪ/M‚Ò «a\¥ªÉÁ©—ß^š bÆji’0˜DØB \úGåKð—š&U±$„)@צ¸äÂ!]ª yÔãÈǃT A—Õà!!9;ç±LܾN% å÷«m¦;rõ´E³‡®2Ð5½ñÉÝ6™JÛ£ÙA<ÓºÝ Ç˃¦±<òî°>¡ýNÆ29žgb#F³‰Sù5 r†ÚáÙ=1Î(´k»â°·UX§Ž‘<¿×–ÚoÓ3&*Å,[µzè8†&‡O’iœ´a˜ø6qä½çûí0nx@b »ÇÐÀmlQk<ˆÚ(QßG*Ó’ÊÄHUšˆdŽTŸ+Øþ„8µjw«ä*Ž¢œ]Wq¶ï_È'ó$ȦqÝg僸 °RSî*æÉ1È`bòk%ê¬@Ú»§öiæÔMÈÕ~ØMŸêÔ×ñÒâ*‰í ‰M³2çh<>ºõº¥«DL*vX÷R?ül·Ê²%yê<õó^gûôDP»Gü—uƒÙhÔ³(„ϧ'ê꫌E‚hcÃçùb wèðííç×áù;Tã§ý¢K_LTçâSªóbþÿxnêV¿Ò ¡žïƯB¾x~\f#ý´¢Ø×?L7j ´ôÀ! MÕ̆(…D‰NòI¶.si˜Ak‘TàLSCé#Q®–ôe*öø¬ eábm@ ½S—!=§9<iG΀¢!6ÊqãäÀ*í'») %Dj;Pìqïc¯†")#Só³ gmlïF±ó6dRã!ÔÇïDJ®†b÷ìêðc¡°?à݇“*èJbS",ÜÑ{†SsÌš£:õµø}¤ú{?Âð|‡æ™Âq?Cä&0ϱø³ Mó:ЏæÑ¼®ÿÆ[NNëC[ÏO§Fnp#t„2ŽÜ`äÿzäF“²'Fnp7‘Fnþé‰î…PçUøš7ú"`ÂÇfLSâHj¶¥ø’A·|bÐM3È/Q›éÊ‚7„å„ÿh^khÿxš¼¼ÙnwË¿!é4횒ܘú¾gTž4õá2þ/SŸs Ž_?1óQó¼ÏA Y`2§%ø¢Ôä%ÑÄôÃÁøið6)å$¬×46vL9°˜É"]Ê8)ÉŠ X“ŽôôÍÜݤMôÿ+èWõ§³“âÏ9ìëëendstream endobj 177 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3086 >> stream xœÍVitSÕ¾išp…R°×Ø{­C­]>A»¤ P•¹”ÉÚ‘N¦cZJ§tHr›Ü ¡SÒ¦´¤--ÅÊØÑ*ðeÉC‘ª,¢¢xn=}Ïwô-õ‡¿ÞZYwesî={ßÞßþ$”§%‘H|—.[’­ UF«2§O›²:.A­ŒNwo=.úIÄ=ć¤Å8æõp” ¼¤àåyôÁ V´û^”;EM¤¤ɺäÜE)©9éI ‰™þ3¦M›9e yÎöÉñ_8ÕÿåèØ-)Ù[’ü£U›ü_žºlªÿò”l²˜ä?)Eå—­Œ÷O‰÷_·Þ?,ôÅÕ¡þKV¯[úÄÔ?î÷«EqÁª”E©é™êì蘜Øeq+“ÖlQ&Ï¢¨jµ’ ¤VQ¡Tµ–ZO-¤Q©¨©Ôbj:B½D½LQK©eÔrÊ:E=@€¡<©‰\¢”üàa“Þ'Í—^ñÜ%[&;/Ï“‹cÚèGè]÷œ1öÝqaã~õ /¿ÎûyÔá=\ .´Á%¾–-޾ßâ’åÈW@M×=‡e,_c°åB.èµ¥ùøÄÈ7lÚú¨¼0ƒNÉ^œ·¸6@–ÓÒ TM _¼O½QkÐsºäPHrº[8{€B ¬–£9è¼ÌûWÉ.QæÒ8|ЄÓäçËØÅvÄ:Hó.®…n¿du¥wq…uªÆU°¢6-«ÿ‰eNãÇ4:å°•oä"±½$B!Àé”H. )‰+4P¾ŸÛ…–ʘ¶ë?=ö®ß)0…¯Þ„óÙ[§IXä´Ì[ä5NqšC"šÑf…Ý7ûø^Àc°$ ߫Ɗ˓Ñ=€Æû­1ôìr…6¡8L™±Qµ¢ Ö¾õ@ξʓÖ.[OÅQ×¾Ýúì{aô¨¢¢ŠViãh’íÙg)µkxŠK‚d×¥ÃkP¾ÂTi´@ Z¾h ~ {ÍÆX8´³õ÷¡Þy>š¦ÇÓù~{­Q° ïEE¦:“MœôPT¸4˜UvE÷M¼ðJ<3 G%áX䇧£å€fòF4 š¾9^ëBO9DΕïô¹tzÅéW.¢}}™‰âQ¤$ù3s¯aO˜"3ÕUƒ,€×Ș@ò,Xµ%‘ÃÏI,½ƒ·§€d£xÛösLh+zÎTaÊíû84Ž F SÐÏÞŸÇÏš ±Ø˜ýz‘ŒBc7Ê`÷ômë‡áÀÌ­XF”è]wj¢ã ]òeüÅâ½ K{Z[)ðuTò`™üèïj@ÆTD”°üHTc„½pzxŽt–œy* ÊÚÕ‚¦²µ×Ž} 60ÉÀÔ…º4}J}žêagµµÝAéeJãDs³Q‰ -ÍöAÏŸ®r8s¾L0º&**ŽËÒåLñšÂàø¸xàB ö+SÝAäbÑcrr~LN^$gòf¿ê?IÏ«ÙÏå¯á¶,<á«Â.àÎÂÞ³UïŽr¡qh\‡\è —²×‡ ¹Yû/B©­â0÷6B2¦?q7E^œ÷ÌÊ% ›æƒå4CCŸß>t |Þ .?Y0/oz ¸cp¸µç¼éì­Ú«Ì%®.ŸÏ‡ƒÿýÜp°/“8\%*,.uY²A ÜÓ‚NÙehÈÑ©8ƒÖPVZ€9\Á®EíeÕ“ÑÂYvö@#X\lŸ )Æda¿v”•pf­5Ù¼û`»5òÕF˜ïžÇüÓ S§ìƒ*Þ¶…{ÿlÊ7•ÔW‚µ|;š„ºØ£¸Û¤]´TX*Ñtméë¬Ùm¤Ý-êØæBµ_rø0©¢nHQqŒ\Z´*MKÚ`3˜÷-(œµõZ{TÝ›{Âk_…Ù0?\ó’.¹n[ ´‚½ÑÒbª†Ž×Œ»û«Úá0ôoÊ›Akã×ñ/òK’¹9IIëJ#iF3'ÿJú)¿A8²wçAšYË7Fô³Ã©íÛ/Ðxf¿‚Ñ<•7/)Âo#$î.ï«xóØE4Çz‡Ï“½èmŠï• è‹hùEéí®šs ËIW­ßšsaISÝ!vÒÈ™S~àêÌŽ ý®kŒ m|ኄˆTeÔæ0ˆ€-Í9ݤw¡¾Űæ0ÖÔ>v¬¼öC{Z]\cLéêÒw,NP8ÚQÿ8ÄH—OÙgºÏ|™×ÅÞ$<“ž \!Üe¨Ù¦OçÊŠá…8Øä(«4˜Ý¶tCÃ(©°éã‡ÈRy"74"I\©\»øà˜dBn}»¹Úaªµ´l«Í„lÈ(Ð%Ó¤#K»úˆôöï<Ž@|ží>Õo¬wŸNs÷YÇ×ÝNŸ3QðÅØ¯}Q\‚Æ],Š×óÚˆ©!…ñ°æ¾Ñ‚‚ZѬ¡Þ#PïÚhæ…^“\V KÛ‘Ý -ÐTgÙE3û?¨ZÜ3ßÏ-à˜Ê³ð}ÿš„h@Àò2U’»¥n•–-žÑ*6\Ø~Aú‹Ô=ü2äóo*Åe±™µv™«>ºùfOÏ“§ŠrðàÈ Oë<Éš#:¥¬Yþ €F›ðìÏêRKÂo—±¢‰4BùAËNnHì’åèá{Bq%pU`.·V¡Ÿ†Ç³Fù䑳Ú½f>päƒ{„ ¸xºø»X%ÛÑB2§ü¥£0•˜tn˜´|ÉÚÀéP qWn·úPÕ µ‹Fír Øë®Å]uÃA–’‰–‰z!cÞER¡ŽDœÕzâ²³®C!ö+Ý䮢6÷€F{ZÐ)‚Té%ä"ƒk¨UÔ~;ë2~h|ã·ÙÏifo%A»“è>"3ŸÛç “ÀÀÞÆv/*fÑ<9ò"e~¡î;:ðþ’ðLá™ä{Ë÷£&k‡`;ÜÍ„œGK6ºûÇ4¡ÕoíoªmBÐTØä³c ÷\ĹõëÎ!Ù¹Ôðe<=ÄÃâ$…P§mßDJ0B»1†fî¡:âcµßT˜³¸`>ÍhJ#kãìYyy›µ‰:¥-®5{é¶Ø(m,éý…‹ ¿\ƒ¼ýÐX@žý5ç­»uýá­4“ɶ¾º –û¥“i_jTšs]–v£ÙÜÔØØ™ò:ßWàÓÓ5ŸX»‹»ÕM½Ý–z2c]¨/Õ”òÛª k¡ì6¡‰Æk1¥Ð§j·d§¦¦ÄÍH¨g ö;sÍxËNk{ƒ³²ºµu/|Ûþ¡Ï¤ŒS‡ÍÝð<+ú+ŽUZ`;°¿{Ÿ@þ¾-¿D‚…ü úŽ¥âˆ¹GÊmWuú¯\Õ,[¡N  ò·Ð÷2æêo•)h¤î/œUýÄV÷g¾êW‰âÄ­Y®ìE’>{õ?û2N$˜—€·Øz¸“¢TƼ‡ÈïA¹¶d#wï” »¡³¬ÓÀ1>Äïæ9-Éé)út]jCÚ.èg«Ù9j¯Èe˳ÐZ—’:QØa¨Ù‰BÈÜÎ6Šë H-AòÕXMÔöudï@“ÉØoŠ2»¾LCpf ¤„uI|~p±¤‚{…àpHKìuWp¬<„í–NšI !4 ÛëÍ\µi'ÑDò©ŠÍ8hT{o¦Ònr0ˆ:}™ b9I;Ô :Â=‰–Lz«QàÀ|áDuùÙþ7Lv#¹"™/€H€å¦|#²ÁP®)+Ðgç—â ìÍ~*fCû§yHr—£ºë¾ùö£¡|ÇoÍÑo½IDhƒVC[w› "ƒî0'’»‘;ÆÑ·¯‹ÿ‘£ýgWyº)–‡ý…¯õñÃGÿºâ2âŒ_,ªŠø»ž~÷_yú¿S§7PÊ Ÿon¬»Aº•‹Þ K[v³ T’¡SéTm@pk¶´Ñaøüè&ÍØÿ`ÿ·nI¾ñA›¯^¸êûj[ïQ¢07okJ%¨Óõj}z]æNpÃIô-¾ÿO÷¼ÕqQRUYrר¡qõ\³&Òëðg7MF“ÉXaNzy9w´›'‚ÅjöOQÿ ešàendstream endobj 178 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 343 >> stream xœcd`ab`ddôñ NÌ+64ÐõOÊÉ,,M ªüfü!ÃôC–¹»ûgÒO/Önæn–Cß÷ }üîÏÿÝG€™‘1<=ß9¿ ²(3=£DÁÈÀÀXWHZ*$U*8é)x%&gç—gg*$æ¥(xéùê)øå—34òó’R3sÒòÓBR#Bƒ]ƒ‚܃üC‚5õÐã3000103012²¤_Ã÷Ÿ©õ*²ïO|Ÿq˜ñõÃï¥w¾‹ÜaþñWì·è÷[ß™VÞ½4çŽä‚w†~+wsüneû­ñ׋õ!Û¹ïY¿±}çý}‘õñ ¢5.v¿¹€*TØŸÁú]…í;G÷€¾Ò…?æ|_8{!Û ®'Ür\,!!ñ<œÝ<܇z€ ·ˆ¦öñðl^ÙÛ××Û„}?æòð20шàendstream endobj 179 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 947 >> stream xœ…’mL[eÇŸÛö^;Vë¥@3×ÅæRdb$Jb2y[ï¯s–a»–ÚB‡ ƒÚSnGqÝÂÖA”2FÃP7¯ÑDçÄéöe–8uq¸˜‘Lƒõùõ.™·úÉ„ÄÏIÎKžÿïä(¢RŠ¢RJ˪m&{µ­eW¶¡ÂÜÚÒÞiwžÓ)1C!nSöJõ±Û±J4JШ¾øË£EûV<¸IDIQ ­ÝùgwGË¡ÃG¹²³s 9¾Ì™»¹×²¸ÓA›£ËekáLv W’U–Å•;ºäb —é°sfëaSk3çhæj­û¸ºšÂꮸº¢®²fGÖ†hÿ)BhgGsu!U¤†“RNy1¢"!JG…MÊ\H|¤ØÉ©^À'#"%Ø–µ+Èä"s“W09•M¯ K7ƒÏæý ©à4õ™ìÓØ§¤¢ÁAã9˜„à;úÇ;8Ò¥f½/=£‹˜!#jyÔz‚œ° a,œu-¸—@ €}?ƒ;ÕRrÊQ‰+¯ßMÐ>×¾„¡´ðüÒÌeøÂ{ß’¶¨QçWx=‚#¢½$Œ01•­M¢JwòJíìЮ#{Ô^fâWš]òd¨k€!‹~ŸtM–4"Ë/Áw°èÑ ô‹L‹iV{ëÔ¤ï¥tö Û›?蚃9ˆL-Çuwñqݨ€ÎˆöO$¯#E-‡$•uŠ1¦ |伜σ¤0“˜žgÒªdšÝs•aURt#U¶ô*FéûŒœd2gÿ Ùí¸iò¶/˜Îƒü^÷PoÏpûЛçÍB§Ê â󜴘Ír¨CÃ4¤²«±Ók:ÿt @7òôº›\0ÿÕè·¾éÑO÷~s$²ZÍ>XŸ¹q=x3ͽ#½ jé®l½Æ°Ñ̇÷hƒÌáWaô˰ <ãBšùçé»Ì¤Ì²NØF\ýe¥Þ¾óÌ+H | ¿Á{k£AµdŸÓõ¹ ¥m ÎcØ2,ýƒéà.vÈ(w×Å7˜.ÆkÌý÷¥²wb7SÆã÷q 'NÝzû†¤}ÔY5Œü’ÇÛ ªÌ– Ù׳ë4û»´{C_q«çŸ?ÑBåÏÂg ?ç†ûr¥÷ÓJâ3I<&ýÿ Ø+ßÅS'ƒŒ€Û7?‘ ªuh6fóï÷ú}1ßé5aìKžOøNŒù5ò7ÉÖØendstream endobj 180 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 335 >> stream xœcd`ab`ddôñõÍÏË74Ð JM/ÍI, ªüfü!ÃôC–¹»ûûñŸL¬Ý<ÌÝ<,¾oúž$ø=žÿ{Œ #cxz~s~AeQfzF‰‚‘±®.´THªTpÒSðJLÎÎ//ÎÎTHÌKQðÒóÕSðË/ f*häç)$¥f$æ¤)ä§)„¤F(„»+¸ù‡kê¡» Æ/,Í/I-ÎÌKÏIÕ+)6d```Tg`ìb`bdd ø¾†ïÇÂï˾ï*úžûØþ¬¸pÂ÷ã?nŠv.¬œWÒÍÑÆVÒUUÕYÂ!<¡ÛgŠWŸwOq{Ú¦nŽå½ëÈOeVè=ÐwhžÉ=S»'sð5Lûá<í»í´þil'¸.pËq±„äópvópoœ=±&ÌïŸÈónAoÿ¤žy=S®™ÊÃËÀü~×endstream endobj 181 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1300 >> stream xœuT{LSW¿·-õZ ›t—öúš8àk2 ²Õ9Ca<"> –QJ ´ÊC ôñq[ì#Z|,Åš9'jd›F|§Î²¡Ë¢NÂn3™Æ©;NÑ]Ü\öÈÎ_¾ïûåä÷8É! ‘€ IrzÊÚµ*cá*“Q­3hKu âcÓÕšŠb•~˽Jr´€‹ý¸œÙÚR!HE½tHÙd42 Ý} ¾L„’äú²F¶ããÏÏ=øËÊÒ²j½VShdÆÇ/Šåë›L^5£Œc’Un-­2lÕ2*]>“·6ŽYWZÅ/µLt©ŽÉSªŠ ˜Ò&SÍde¬JÏ`V§§f¥eÌ‹û_¡ÿÊTzµ®X]`ÌÓjž÷ÏżÆ¥Vó7d|2T””¨Œüu£ÚdÔòU£W÷ùZCY±ªúöçHEÌŒ´ôìi'l#YÒA:Évr1‘ϘEÄ5r y_°IpK¨>A‡ÃŸ‘W²;*iÑÑ*Åô ¹46ËÀicmŽœÓ«Th©ñNÓ¯pÐî+(IÑ+8(¯,uY©uõò98,¯l<3€sPNônïKÚ ”Ó ^Å¿Yú…èbð‚ ÐL=ÊÁ(±qgòõj Z›mf kuZ=ëû–}†uÆ{fC¼Ö4§|ž3i˳3ššÀ“›]¶öŽó—};åQXZÈ@…?F"èÇ­•tè‰qžaáˆ~\+°-®ùˆZަ¦!Ïxi=N ÜŠÓœE£‹hÊu$ù¬ƒeÁIy›¡®Î6› e]"`%¶/§rñY^bÆ €—BPr*8-ÆC×pÌŽº?Ëcn³ïªÃõÜõ?Ôp¹ÃBî=š"N²™›Œ£¡wPL ŠŠ~Ôä¶·ÕµÍ g+kUÜÃÔ-<õVðQ^:‡G!¨„àŠA ŽÆà)IX²v›ÕVªÑ ¾X–—zåòM$@Jdÿ:‰ÎîGKÜ(ÐR>‘ÂI<­;?ÕMŽÖŽ™ez±þ­5ëÞÐÕ¶¾kÀs &ŠÑîm—‡u€s8ím-|“Kä1ªi¾ŠS©€x ª»*.³Û‹´c|ßÜh·eZƒöÊG®Šù¿‘@<½çïy0Ðé'¿ä"…Ü“Yφ#©1ù¯'ÕÈ·gjð‘&fÂld=NÐä¦C=”8*÷tº;ÁG¬Øeªª¨/Ùt¦ð«¡žÛ?ùå»ÎE'ÜH¸±‘>”Ò8 ^8dó›t³¶Q:ý¾ü»>‘‡? ”ô¨õ6-zØCòÿÅÓ>Þoþ¬«ñ„’ÊÖyå8“7ü@Ìíà~v¹yÃíÓ ½Ù,™É£épg›ÇÖk¾]óý†@í7¹]Ëxë8 u…Ð8Ol»ÝÚb·‚ ¸c…‘ÁŽà£ÆíÐðG´hŸ‚`¾ƒ QºÿÀ=¡}èŸÃðÈ{ÃÂÑ•q²Þ¬ã™I˜Ä[2åÖLó9 Æf–ãX^^„ÕÊœ¶ (¾Ÿ²{ü ëw úºÂì3ªË(æªG_\“ß@ý}èÛ^ôÝ1¤=†6w!ÙÎÓ|9‡ `rZŠl5 §ŠµûGäá^nv;§ð:ÚÄÝ’þP¹D”Y*ÒPÿnÖÕ¶£ÍépùŽI¥Ý§Ûşσ~“†Äïkd¬zendstream endobj 182 0 obj << /Filter /FlateDecode /Length 3385 >> stream xœíZKoÇÎyOÒÁ‡9lê¸Í~?è(€ã8A‘eÞD'‘KrÌ}г#Qþ÷©~ÍtÏ6i ð)ˆ³³ÝÕÕõüªjšLçÄý‹/632¿žý4£þí<þ¹ØÌÿr6;yÃ9¼Á–X:?»š…-tnè\K-—ó³Í ‰ÅÙ°Vš|­dX+ËÏ.goÑ—Ý»ÁDrM‰Emß5]»þy±äœakúrÁ€ža],–n¡åDšôÁP£ zŸQèš~åv x#ÑW»Í]öeX(­0õMßî¶ñ ÅÑ}Ûߌ_ÿpöO`\‘â’–a#"çèMín!,K—;],çÝdL¬2Öã1¬ QÈçMq«ü¦‹°»ä€KL´L»_/˜ÁÖ£æÂ R2tÛ\SŠé@Dȹ10åh,¹"X1_5£T õM»ïKÉàÊÑîÊ= l-CÜs"1ㄘù’R8GÒ°ëó¸Ì0t¹{ÿn½Â—íuÛïÓn'£´ Ý¦G2Pˆ}3;{Y#·ºZŒX;!¶}¿‰1ÌhFaWKª<å:¹íêÚ‘2i9ÊeÝÖ@«‚tÁ«’|6A”|YÆH¿mšpei%êÛý¾ñº€`f ‚¯Æ —‘¨tªl¯#÷~Ál,iÞí¼`–Œ[ ·\R1&\öY¡‰Z ÏýÔ 8çpgYÚ]nQíz·Í??›¬Q¨éc§°¥N4Ö2Æ_Ăڌœƒâ5 Ù )Á;¹“‡õ×A¿‰ët¶Nai DJ’U-€aE8…09{;•ýð\ã—QÌ(£¿À¯PöIü*`/òËkü‚ (EØ„ßc/à‰§íï‚»0¦‡]°o?„ôÌE¹ 2¸q–hVDÀŠJ0#…µBJ)ÏGáZømýäИ»róÍ­¤-ÀA³vçs¹¬¿žÞ· ÞGX<œê«*\êçôºPâ#Âh7Í:îªùž˜ð9Yîj¶ñÒÀw%R†ÓHé)Iñ‰‘’kž"%àn?9PFí¨Žˆ¹@K° §  *1£;„KŽýôürÄkpJÂÉa(jª N²RHû¨ÔâäZ@‘€cÁé{½Ù9@’@C•¾Ò‡Î¢ ‹}^é†]Å‚fk“䘋áeŒK UŸ’(êw©LReq”òqˆÓ|ì¶%´ßm†³ >èJçݬÊ@—jV†…Ç ý~,°8 Ñ>9@¯ŠXÜ^?Táaa…’ÆŠûµûôÞVrdr[& í2Šò ƒOÄÐì]Õê•ì¢ ¸xTrЦÄgH&a HÕ˜(“R[À¢˜[Å-åø.Eœ·¹¶yr¼†E\ÃÈ$‚ð>§]®@$VVKô‡ôHÑ{ˆÅ×é#‡•‰Ä…Ø µ»nurרö²)‹”|=ŽwY¼pME‘M°PÉ&Ñ‹h9ÔµšF¾‚ sýáÖȽuͳw«.ÝQÞ6o¼„TC¼l¨ôµD>"›æ±«¨¢ž<ž£B‚È(k‚©`FêÃÿ‰©5ßò \ßJ4k`Õ'P&‡®â[YЭSeP4çtX$ éꂨœ„~€]`$ІÖ,¿ì.憥_VMëÙžR—º¨Èèøt|dã#Åø(ÇG5>êšj’»7C”ù¿FJüO¨ûîs Ü¼Ê´´¾\º¾z¸fqUîÒ‹ôe<£ °·”•¯·‘¶BÏîdäÜLZòW‡ø½Ö—{9 }–yÑF*ªÂxðX DœÞ¿ØÇ¯Së|O„ð€nÃa¨¨ºB(úE(æ›bmi/J(¥÷»Ä‚=ìQû‘›Tiû$d¨dŸ  ]€‰]—„¢Ñ³ $ñó±¦3CážW`i¢Á4Tx}:Ey‹sÌð¡Íp&ØÎ'O4¢ ðI“:S ݤޅ+µ†2N-]Ú­™¸–è:vPÁòÆNE!ߦϧ˜»nÊŒ¯ÏfßÍÂZλ‡Ïà®Yg.ιr»ÒQSågÏÔÅ®HôajLÏCØa“16Î…TF S „¾ ¢¹Ÿjú›Õ¦éÛ‹Ðü qï«ÝvïïQвìž§Žúü‹ãÔ;•èu›¶»v`ˆP¦3æñ(†æß†Ð\òT¹¦\ŒÍç‹pºn6›&ú^õÕ èæ¨˜09‡l@=οrŠ}:iPúð9é©M­'½…9ÑÃÐûÑfÊå‹5\ö “r/6÷Áë?´—Yý0–s¤{„GTiŠ}0¶x¥µveÞŽ‹Ñ&zû¾ýºßdzÀªî‹FPÌ8àw7‘*·èÛ×Ù’¿½IÇ™ƒË;‘0:\¾Â½Ü‚¹9køÐ6ÕfÈRº™:ÔpË¡§†çl»?wÐJ[RX( ¹ KlAÕp¯¸Ä!„¡¼Å‚Ú†Léд¤Þ–X3e‡_CÄIWsót×MòñÉÂ/R„8S“H ‘¢®|Lý~Fn”®(Y‚óí÷Õ*ÕW×§"U©W?ÁΣZŸo›Íê—TpqŽŽîÚ£ã¶ù1¼ˆttÑôͺÙ¥BrýÑzwÍŽ†–û£ÊOk¹ËüÒµi|•îŠtéÁ¤¦vݼˤ¿.„ït¥¬gäþÑü>ia–FbA~\'#‰w¬YŠÝr9 ZßVÔ+³ÌV ÿãw“¯³Àòþ@$_ì£Àßc®v[ˆŒÊdÎ]½ƒ£­[ª§¯€²µ­ÛM"[Ìu ªµŒܬÌßVgn”k“õ{K•[ÅLrgž\¤`ðº2†%äà%ÇÔw­†#5vjR¾Gqë+˜b%°bÔ¤úä•g ,™bs÷»*CdK ‰ÝÌù=ä÷¿Ï ²9e`:ßÀgëJõôb=ûþAP2Ð Û™Œy@q[èAü†$̱†¢H³Ái—R1d87‡saì;Kø“ˆC9’k­¤ª.%rK¥Y‰¦¤„ Ú'µ£ʦæÝiˆQš„O¤ÖÕ£,ŠV& q'ÿÉ/Lb©0G¸k^μC&¢Cܪfáf1C4/§¼oSÿ«ôU ‘yµwcÿ­}rvw;BÃò|ÒYŸþŽ%àT,½õ=~'ÓŠh¬ÌhL ÜÓM´á¾ÎZoúþîôädµÅ÷ím{·ºl¼ë®Oܧ“x½?2½ÿWƒèã(™þÂ¥”fÛ? H×J¡Šuê¦Ôÿ”Ésv¾ÀEÀ˜°Í2¬48-“î zxó˜×Â27•Ð*?ÎfEÀZæm2Ô'oàÕÜ®Eˆ5T:¼ AÊa¤¡Äòûuîm}ÓnCÚr}Ü.# ç±€½’ss‚Ë]פQîžÃHÖU"LÓxýìËoÿš(1ôúfµõm÷-ãÈ2ù|üöÀÜ2Œ$ [í÷»n¬•¾›ýQ –\endstream endobj 183 0 obj << /Filter /FlateDecode /Length 2788 >> stream xœÕZIoÇF®<ÙÇÜôA5 »Tû"„dC XF¢ð&:@sØv< ÕÝ”Ì@?>¯¶™ªžR4’ !a³§ëÕ«WoùÞ2ú0#˜Îˆûë2[ž|8¡þí,þY¬gß^œ<Ë9¼Á–X:»x¶Ð™¡3-5¶\Î.Ö'HÍ/þ´Òä´’a­ _\Ÿ¼C/»«9ÁDrM‰EíÐÕ]»ºŸWœ3l@/ç øÆÑb^9Bˉ4郡Ft—qèê¡q»¼‘è»íú6[ „Ò cÐPívR}j‡›ýòOÁ).i6"JŽÞNÝMc"„eér/æ•à\£‹›Lˆ&=à …~ÞxŸßtv—p‰‰–i÷_æÌ`ô¨^xEJ†~®—AÅ”b:0rfA L9WK"fp3J^íp>¯$þ„!zæž¶–¡Ûöïi£óøÞ0Ä1L¥%·‚*ÏD[¢©3§¢†j,µšr©˜Q4;KŒúŒ+üùùgüù¼2X ¦o*Âü¥)…›H¸ï'¿IƾP2*-ÜŸXøOƉ°ZKƸ¤Œpn•Á-3‚Ie”Ó’q̘¶Ò€dÂKv Š8’KcµåŒ»#µæÖRˆ'XÕV.´Áš>"Ã@c¹qì´8âWŠæQàʆ»ëfŒÃ1&@YB)5-8³ŒvÉìf'í&ÿ’QeAw\K:-ÅZPÃTS ú¨G©ÿ¢d–þ§ù= *CtþÌA„ÈâÂ]€çF z€¨ˆ`‰Á£I‚ªõíû.l £± íàls·¾jº¤ ‰¶ï3ÅtÍ¢í=¢R" ‚°'©zÐU;ôþ6•„Ô|Víôíø¾£?eótM˜2bµ°BÀFN´¡J¼EO(Ió{)¬ KÆ~ûÇý5¾ùfÿì3B‹rÔ5+È›ôF¢¦ë¶ÝÞ{„žbÛ^u™ÎþPí×èÞªýãmûìué4¸sƒ>6ÝÕ¶oÎ_¿üáo¯.ç~=O»(dºM?\¢ÓÛöô €(Rü»^»Ù?{í®úbroÝÿx·nºvq‰ªÕvÉ.Q}Õ_Æ ^ÎÝï|"™”º.LÍ$ø©4nczÜ‚ùDLº}ˆa†}PJs¦°±)Û¢¾ùrxW.ùI‹$»¼2)D1c¬XÁÝQŸ½n>ø4),sÑ]³Y4a޳¨¥q%T¸¯ @¦ ‡}¿ñûÀ¡›tQY—*YYY”|G•Å™“˜z‚‚)V.ž?Z7y¡4´ GÊ!ì@Cùʇ»Ã¢$¬l²…¢Ð*¨zÇ—yCÖ]?QîØæ¼z·b Ä-ÈÕÝž+³V¬`ôÐuà ‰]ùZ t¿÷³LC¶Õ3oØ{B©J`£¸â¹* ¨ÒH4Œê4¯7ÉÑW}^´%Íi‹•Ç4>|4§¢–±‡ŒBµ†|Ѻ_óÂ+jѧ\x°:D$_…n¢«(ŠÚd3ðç7”àÿCg&9–Ê9/üuÎæõ³L²keræÉ¨XèÚ¢@w‚YãÓdïq5¢2VÜðIø²Ô#["”¡5ìr•Heѽ>yóZðŽû¸ÅÁf«å:ñE·óÊQÃå·}ßæ½Æª‰çÏÖÝ2×þzdÔ$JQøÆ¤MâŽM½ô€&ƒÌ©G½¤å|\¡Áë·]t0áyˆ—‡ÛCßÔ.ov2ä¶û´ÓXÝ]ïW|êr¦6&áó°M­—Fõ]f·a»®‡ÒÄõ*4jÂ[y9!…›„…®^¹è6†HÚŽbÄ3•âïEšh†B&«¢¹x©«µW ”  Íä…æ»C³&8°HpAk(èêëQôqØbxæžMx v@¹´Ý6ˆ 4úØ^—ÚÕ?9bŒz´¼ÑãÖ)µL~SpwÒÌÐ2ñýzÄÁOækCÚèYÅ õQS´$ XȨ>Q¼õŒµ^mï6×ífyÙ’;4ÛÐ_$8ïñCé]i¬4Ñ‘ü,ŒXàHxÔD^ÏL³ ¤ÐºFòfX¼˜RoÅÁLÙ˜òÿ”ÊÒüišd_‰é>®É´®)Íõx,1 g@¹;q„Ûl&_§ƒ7¶ËMûþè1C“=rÈÃÍÑ\:rÈÞ)Fû´q$¶Wý2ÒCAäÐ.ì¹4£)¯Ká™ñd¾7õpæn 5,çdwÓ%h?;ä¶Dhq¼ ãDæ­.,ò î*S'—Z?0_x¢°HN]·x:y¹‰®r$•àÚ½Œ%ƒË#¼0XÕ}Ÿ\«ÓÜ“1Ü ±¹.írLª–"u–ŽZ¿˜ìÿŸšl—Íð'0Óí›ÆõºÐßœzëž>ÐÜ;ÙÝœúX; ý0v/BXœ>­#ío¶ŸÞ4ÃÍöz/LH@ÞY8õ6ý9 X°ÜnXAË—]WߟëÎÜi¯ï6 S/W=:~”èÝÖ‹07LÍï:Š4OÐ/çÑ…žމ æ™Þ_ÏKÙÑ––ùj§(1¶9õí.Å6W–Ø—»9u¡NFÍKÝoC,„ ÐÖѾ–Êq †¯Èï{hùèËl£G¯w÷¡‡=…õ½XWÐ÷9.¬†v„WÜ:ÿ—©<„MdùótIZ|¸Òó)鯬×é.R—ËÃ2õrš$”͇jâ¾js³$¨(±ÔSQ˜„qÓCÕìUæ Ð_œM÷kûªÀͱ¾u½ÈTâ’Ĉ„±(¢¸ÒÃ})ÀaB?ÃϹÕûçbô|í«MH6õ¡„ä6=b‚ÐoõÙ>ZcŽÏÞitÝ.ãˆGxuŸï'Gêr¾;‘ïR÷~7„Äû›û þ¿6ÂL³.¢œa‚öŸ6à HO‘+v©`ÆîüjêüŽeé#ò°äøª¿ã‡L 4¯Ç~ÔäË#µL<¿s-ô4÷ÕPº§b¡eSÈ=ÚDÔ„†66ô ’ûÖ³nS¡¯Ê‰Ð&«‹ê¯.û±¯c f¡Ê!õ£h?DÇ[É(šg¼*¡ºß‰ŸW)1Bü „Q¨NB *¿àìÏR«Êœ.#…=ToåuW«IÔâ jKf·G¥=Ó¸+uF%l ‡Ì>[Ù2ìÑrWdÐÀÉ£ÈðþrƒñGAZS"×}¹Á.ø‰ñ\pP}ðÝF ÚL‚ßü ÅS9­øÿWuSù¨º'¿JÚ©[Ǹ}5úãÖÿËõ¢¢eKQ{Ȳ>»:a<5ãÈv ÿõ¨ˆíJˆìãL’ór<~ö[Áú8^¡ê[_¨rkO”~i×#\\í†ä¶(và`º+và.ÞP¦ "Š›Ýdé7Ñ–‰ÄÒ}ËIH$á%‰‚—ÅRÉ’£" Ÿ‚-Ç„[šÍ@œê-ä„×Å~É¡²Bˤ=sˆÑž0üÛ’#åò (%ç}ï2Ý÷#¹RqàQB¦ Ñ£ZQI·çSjјið“H²Ú.£ô dÕ$}aäõ_1¬¨q‰HÙ7tî¦9á%T6)M˜‘{`)UºývŠ!´ü@DeÑòwÝWnøÀŽ„C«Å§81‹ÉÞ  Q¥JùÊÔ?J_”Nš’B$…cÇüÕÅÉ_á÷_CðAOendstream endobj 184 0 obj << /Filter /FlateDecode /Length 3436 >> stream xœZÝ·O^õd¿…r/¡‰á7¹nRÀ)šE\$νùò°Öéî6ÕJIŽ}ýë;Ã]R¢|çÀÀY»$‡ÃùüÍpŸ2ʧ ÿÅÿ—ý„Mo'¿O¸;ÿ-ûéw—“¯_K ohÃ>½¼™„%|êøÔjK©§—ý„¸Ùåo0W»|®ÔÓ/¯'oÈËÝÛ£LKËYCºÃ®Ýuë‡ÙBJA§ÈË™zNH²œ-pb#™véÁqgy—Qص‡®VðF“nûûl0LÔrŽÚC·ÝÄŒ$ï»ÃÝ8üëå¿qÊC6‚:9'¯kg³”)Õˆt¸³…’Ò’Ë»Œ‰UÆzÜF4 ù¼.p“ŸtV—HM™ÕiõO3á(ƒù¤]zAjAþÛÞŒ0FØ@Déibi,¤aT35]5gL õ†ÿ:[p¦a%'’qO V9b˜Èž&ål¡pÂ%á‚)YvÊ• Œ¬:ꤘ.§‚5aIa%ó[<{‰‡•  £ÉzýTe‘$éÛÃÝ þtËví_F±oR‘w›%*v¯"7d—2KÚÝÛÌÆð¥tä~·ZvûŒÆ*ò[ù"1,$5ÊÊhÀkdBYØhBʉÆ+¸G9“_2½)|mh’z6¤Ÿ;ˆ¥J¸&ÚÙ+8m0µ’!ðgRôóH<æv·}—qq¸kàX7ÙëÜ6w…cyÇö‘,iwð¾i¤ƒJçTŠ\Ÿ±sò—l`“m]LÊW£ÎÀÔ' ÷Þw9C·éÔŽô32Åìõ¡Ë½g½ŠšÒœäïw…º}¸‹2䊼ú ‡Á®Xå÷¯¯f‘$S “BÙ~UÊr™yœU¿pŒB€h¦ .©ÖA—M ­‚ÀDçÉÑyæ£\Sa­^þ8¹ü„‰ Ç)/ÛÕá°ûW«þíj·¿"hCÀjÅ׌dÌŽJ-2W÷̹hßî/à”\3r±ïn7ð ŒÐððûî0<,WݺÛÜ^„A.nÖÛíG9ƒ§ÃüòÂ3À9„!8KäüÍ÷Z¾ëûöÑV‡Çn“?Þï¶×Ãð¼×ë÷£ð»çaÃÅxÆ´u8¤üu Sëíí°~s6ðOb8&ÝCËí(ø}6ôÇâMN}ïO‘d¸¹èÚq~m =>äąΉ·zœšÈ{Û@?¥ ï÷Ýð«ðiTP3(Hò|3 ‘-»mA_£¤ÒcÐÇu7<{uvéE-¼r0JHžiÛ÷G¡tttWÉ ¸/AAövÉ©ÃгSè‡ëÇTÀy˜9‰f§È¼ˆmã³_ˆÃ‰ùZ,†¼ÇÍŒ; ”L#l1\!ÙÒë¦ ?[Ÿ¥¹²äîú|pô‡n´$oý|™í!J¨Ž0†dÖKÖøþû׉EÖ]޼ '‚8 §4!örAœÏÃíu\lÈ9 e:|tE\æÕóàW£Ú ³:ЪpCæú'ä¦]¶»®]_¦_ž˜ÑÄ€þr!µ`¸Á¬ßV÷ô¥x²!rÑßß@ô¬Øšôü øð(Éä{naK´+pý<³þÃB{;Ñ.„IðAI Énáw{]Ìɱz‰ê>Ä!¯zÇ$ø Žç¥X9¡s ‰†§ù¸†çÃïÒö‰™ÒO-RN2Þ„Í!ää:Cq,hòE?вbéHoJûÿk‰ ž¢Õ‚Ñøôö)¤¥£}:ÃJß d“ˆW³ æ¡ëŽz®‚˜¢> ÄŒdæhßl[…às™€IÇ¡ÅooìqhYtñ„©…Tv9aížçÎåÛ#Ã’A‰P-…†á )ãqBýp.~ù²"WZ»^'s øïí9ó ©3Å™Ãr¡ûH ™H–«ûBy»®P°àSd“7±¸åâ´Ø×}Û§'Å1òDW(ìœCÕÕ˜ä Ÿ]‘è eJ†m‡¼V÷GËÝ޾ÂÀ©ƒpd *èÅ’o«±*o.†Øà³ëÙ|ÅëaÊ"aÓdŠ3Bs*Œï!Ð{~É=¦ïÖíU[(ѶU^ TÝXÜ}JœÒy6ÇÂ5Xi#¾\hPÅ!qaH¿EõOznÏæÐÒ‚1â*já»ÅÄ›3Fºž[¾çX;]ñ©¥a5§Af—C¼]Þm·ûUh;ßÔ… UMø]æì˜©”°,U™^Áõ]HÆüAî·Ë»Gö#ucõï0ç+å2UbØBCÑOHQe”Åž4 x¬ÀB-§P*€–!tĨ`§`ü–…½" Æô²¡Š2åX<àÒ^9R6ÔXU(çÏŸßÎ?ÄÛ’Œ¦>&çªxQEf¢a×ÁÿL¸! ýg{Hµ†5eEÒb©ÂL¸\ Wmº)§ùf™ §'^ ¢ˆ€;_aVwyCc~^/àØTލÄ€Eþ¨ÓšLÇ!56h¥Ò”øLŠc.‡oDs¿$»ÁôªÌû îÄA¸Áöt¨ppâóªªÐ9˜tk·%lT»DiË£€xœ±?Ždeì`ü!<€ÁF…=ÀøØ,}zóQã¯Þ¤(Q)$ Dëÿ¬K6"Ùõu*ÀrÆ›µ¹U—— tÐêS+kDj¼‡Ì¯!Onu~{¯Wãucß ˜_¡‰Ã6  €¥×ioŒvíL¢ Klå" kdô@Îÿ®ÞDZáÃg¸‰4ñîôò¨ \Ó \·û²V¬Wn{¨¡|7òžåCµ'i9YÇîz=ÙJ±ÆÒmwØç%塺 `Õð¡×PV;»òoµp½=nsúƒ­ßæDñŸô¸Px¶Üe—Z3Y/ )ð¬AUiìÄfÒ”.Bláƒf’}üΠ”ZUØè–ýyÕø#w¢¸aüÔjZ;µg•£ Ö?<ØÆ‚oç;½È©4){í ½6Þ}¼XwYEîBÍ}é¼&nµE…>‰ŸÙð2ôHîå\Î×Åx´÷¡Îгÿ·P}¿†ª*­¼‰+õ™Æ^¨ðL“Uxe…¸¼Y’ùü ‘=òd˶ûq_4oàæ–^í¸iC!CFm^w}M“†Ð`œ¹ÏzJzÐYÖ¯Ñà ØÐ#oT‡/x¤oJlŠú¸0€ë˜ú^iá=TÃQ_K>ò½JûªjêÆ­a¥½p_îSçôÄ×3mOó`>¶äaœ´Äo"à@èÚ›(eKÍû¹J¯B‹‡]nA¥á\ zH%“Ç;6´¸@€W„b‡)}ÏóÍ"~?à¡´z?k*¹‚ü¾ˆl‡CÙ›ˆŸ7(X1cÑÌ+?o¸ýÈ®©}àp·j¯¯È‡ôBÜÃ`ï{}ì…§YbÔÕìk‹ç ³ ^‚…ANúô„ü]õ‡Ú·þ î»ûÄøû?£òa¥ÚÈ¿âöéÇarqcNîX¤ÖÈ„†~ÄæÿÎ#}Ea|PJâèÄ£c0£Âí<*ÀÌ>ê Œgø@BÙüƒ/ N6Š‹Q®„Ó¶üËÓ0—ž 'ªß~¨ìÛF+t¥É Ÿ’ÕxžqBe¼áUëŠ_»œ—÷þC0– Ïܼ–WDÍÇMå3/µï°áŸT“‡Ô·3'78Cd¬ù0è*BžGJçn' Ê7R7G`)vµŸo¶»ªs‚¡H¼Õ‹ñn?©9‘cÛžwÒÈ=!Ô<éЛëwh–ƒR¿Mϱ4 &¯á!›$^€³GýøJåçÉÿ’¥endstream endobj 185 0 obj << /Filter /FlateDecode /Length 1727 >> stream xœÕXKo7îY§þ€öf*•X¾R ‚ErH¢Cɇ,'*ôÊJFìþÞþÎ\-i­b7 Ô6äwf8o>Îî§ŠQ^1üMÿçë«> > xX­Ò¿ùºúe2øñv°B=ó¼š\¢ ¯„Q”)]Ym©—ºš¬SòªnËÍp,¥€EC^ý5 C½òŠ|2Ê´´œy²ZÀ/Œæ’4ÃËÉo°”ù6Íj [M®Ä'€lç©7 ÄX)^¥¦Îš’)¿ŽµÐ”1A^*ê ²»Ti3Í3KÜR¶&/“§Sòæ§$î©ë$oT&O.†÷½ÑTHÆ\òw½»n~nšú.ú]h+K™•­äEOde˜ˆS²½îºZ®g„ΆíŠ&χcÎ({2#bÔ&@9j…$Q†ÌìI²kóå~¹Ý ͈cp¡-Xàäýò°á Ö`¶9Ç¢ðèרKkvɃ kQ…¤žC(±>#,†1¸—Ñx+ZØžòQ[K€‡€Îü´BŽÈ/áFÁ¾²m™§"ßAfUâ•©Cœ:žôÞêoA“­¯îkË•pÅ'ïÈQó~r„L¨ÙÜ.£'vMFºH&É®,í2zß,¹]FïßVçOpÖ‹Ñy³ÝïwÍöjpýƒNü' C­³‡s<Ò§†ðÙ–‘k°°ÅSÌq#aì“Ì™‡åsŠÇ¬ˆó€î=:;w Ô«ý6éCÝ2}Œéyªl½Û­ÒhWîV„åÇò^g¤Ÿóv~gÌK×Éí{ y õ”Fà¡‹ÔŒGnVÌ­èàŒØ®—žv$¼¾Í¡4ê´ö7ëcƒ”¨íD„)Û'Çt/êO[¨§yÚQâÑsñæfý~Ñì»ónzd'„Yü„TS# ¬Éæ$‘r#lÅ•ʈè£ØcŨÁ²#š‚" &Þî_œçœ€Sõ ¾GÂYýqËyZMÝ¥"7›9bK pïú9>:³”4qØ&.õŒ áõÀÀ¬…;´€àv½;ƒÚC1Ü@Þ%×aŒx³,î¬ëÍ ÖãõEP2ÞÃÇ¡nÍ¥ D…¸½öʹÂP1Þ”M“RT6¿qÔÙöaòû-Ÿ‹h Çe™‘$S¦ %¼M2·}f ]úéýÙ·Ô8Ád›ý%$|ŒsœádÛ yÂA0Ü œ= Õx­<)Ò[¯îiÚƒ.1),%™aÎЖâåx¹«\Yòþ¸sQ&ƒirøx2ݦ}¶Í]ëŸ)}º*«¸„S$<>î ”1î¦ØrUŠïÙŒüät¾N:ù佇†S*vêäžÓaÞÕ‚š:WYÞ£Û¹0Û¾¡>núäÛžÑXœÓa«å~Ø‹D‡@Ã^µTAÞ¿ Hãõ·¤æ¦Âbõaºˆ:],‹¯]àH•ÂU\H}¨<ÑG²6ù¥ÎW^8ÏÒ˜ßS¦ “l ßfÖá¦uШƩU1üM´ïrI8ؤmŠ<ç}¡Á©S$Žvì§£¯/&ƒ×|\ª>Xõ+œÊLR€Ð±ZZðÄÏ+«ÁÛ³¯¿î0½þ›T¢Mí¨b _µ!D<Ó•„9Šs[J–…R!¡p°È6šgÇC0ç{c&T} Ï–\ùÈ÷/–gÙ> %ò_“=v£où *ä2iè*\5ƒiÙpÑ眦-/OÉm"B ¦·yo 9M´{X;¸(ŸàLq%•|hêU;H öPBé‘—Xe,λž"Žo¡ŠJæE,ºg¬‰Žã¼ ˜t"öÏw¼¯ÞÜÁ¡m@ ´eH•À¬7¾BZ*È:”3†ü †µ¥B#´DTŠãÊW@ºž³*„´Ð;‚lX°!¶èÊÕáÙљ׃¿àÊÕÞendstream endobj 186 0 obj << /Filter /FlateDecode /Length 3290 >> stream xœ½ZÙnäÆ}×ø)úÍÕš©}12Ɔ 80ŒXQ‡™àHm 3-µ†ÍYäãsj!YÅ&¥–Gó0l²–Sw9÷Ö­z¿¢[Qÿ/ýu{FW7gïÏXx»Jÿ]Ý®¾¾<ûã…xS9êØêòç³Ø…­,[e*'ÔêòöŒ0¾¾ü7+›7V¶â\ ýåõÙ+ò²}³¦UÂ0êHÓµuÛìÖ!xå¬$/×Z.ÈÕzãZfµ-|ÈFhënë{K¼Qä›ýí}ö16TNZKººköwi"-ȧ¦{;~þçå_\Ób•ŽWVÚˆœ\Ì­ÍTTJÇûÅ}µÞH! ¹|›ØfÐÓ4¼ƒWFÛ~ˆ‹b?ç+]ÇÞ%¡*jTßû¯kn+Šö¤¾ ‚Tœ¼«o"͵æ&ÂÍŠ1|VܲZá‡[m0œÕ:¦*V­7Š¢+åäåýý®¹ BÝõ(zæ:ð'IP‹ð Õ:ðC—›jÐx {Œ'Ä–sB³Ûß iéò°vÛ{­›d>ÖÉää‡&ú¬5+,ßÐÐÄ!Ãpœƒ„* $,´LiT9˜¬Œà†œ5|M^¯çˆ€ñŠ9;äõ›h¥ð™^øŽ$và’Ö ?”Z#‘вEìàm!Ð÷–ô}7¤¼ÐZ12ÉL01 P¾Ÿy³–TïíŒá4¼Îû–¤aÀE'84mgš»mìD 4¿O“ƒëÝníŸ$rOÈ1Å"gú”fC4If™!ÇdŠmSX&BOïJ¥À¯]ѧg¶qÌó`D«*Œ® K2c;4wÙ¯›>wÖd’:z‡ÎIFÚMB1]EÌ@êÉB ÝÂZïUqx°O>íuŠvè±èþÇ®;ÇD_Ü·Ÿé”2±õ°žû‘Lº&¨ÏÐÐu\r®×‡/êÅ]‡ ¼W¤dËá²™¤AÁÆ1#}°¦ðCS1)¤gì¾<òÓbû@¾<$¿Ÿ„~„IÓ“HscâvÉõ5¦TrØnåÚ>”aÌS/ LX§Gdùåâw0Ñ0œœ°jž qšnëÖû¤qa WçNYG] ê-(Œæ @“*è#hʘeøð9>) ð3zði‹àì²õ•QÜÛ±ó$ÄIn ¹|º4>œ>oR ¿½N­#"Ø7cçÒž£c9¾°¯·†E·WQyŸòSfšbôúà9æÏ¹çì;ÿÞ„´séÛ‡¾+4Øܱ{H3€Àà+E˜…M«oK=ëïS?kÈñ>¼t¯lÛ]: ÷&Ðoiûm÷#~óÊë I³›`ƒŸ…UÊY_’¡Ðq)”â" £$•ت܌ZÃÖëˆZSnt@¨Ep &ó] –ÐÄ¾íµ¢Ë š†ÂAYŒOÂCé¶õaW†|}ŸÇ‘ù­†Òàŧ|s±D8†WBóa×qú~0Ov#@Þ#³—*:¤} ìüª¤¨Ã¡)‚Kˆ¾a½š\ìo×½û-éáfOùG"iY" ßR"ñÊ«¾Š¦­EÌ$—U+Å+å‹.¡QgW}–ÑoÕ,aXƯ©KHã³›O õV^¿ I¾mbôŠjýÇÚ†$ &nH“}ç:,EÛ«‹?c÷oˆ>82Îõݾ½=§çœRŠEt• ä*ï ý@ðC?’ ¹L¤òðË'9oûÝoŠñ ,¹m=Û†‰aNê‘ 4k¶ªfÁ‡9ÝsÀŸ÷ckXË®êö»l»aêÿ¹(ú¯%¼Wäã¶}³?l_\^üýÛ“–w÷bœ“Ïü_þ‹ä±*ÄûY9ùÏøøýøˆ¶\‡g†… !ǤÖ"« ¤^¢ÚwL†ú ÷epÍ¢Öc}|&_„)ŸSs¸‰ÑÖÂù¤TÔÈa89Ô˜Slb›}6£Zp®NhjOÄ&X¥8&¡›¡<‚)°ë%L¯ŸÖ³  Vs ¥qD§A¢£à–ʧô¬æA þ ¦RNêSƸ’'KÒ×IìcVËz™–Ï@&*ã ò^I‘Sz„ìT££ãVÌ"3ÇÈz©sÛ'NP®vÊëƒÒ$þ¤û !r™]DÆ•>‹~äs,_Jf”† áNœ‡Ö¯)ôLÈY|nŸbüYø•½V•ƒé!-fêd|Ò%%Ÿ÷^6r¿JÑ£€¸±½Õs Dà‚Ùi¤$mŸ‚8ô¤†r¦›w^Æ1r*í³0*г²ØÙ ÅeôIŒƒ1ç253¾ˆKR§Ÿ‰ É3¬©œR”sö.°ˆò‚Ãr˜¡Úæ°Ä",ËžJþŒÖ ¼@xÖ³-a‡|+A“ÇÐ0B„°rüò$‘Dyá d{§h®Ç…­tŠIàÒ ¡æ!bG¡í)KÙ…?ë¨'ÊŽUÔ °0Ú‡Ðóµßž= ccúãæ)wÈ0:ã´F’Èrýš#`0TzFÍdÇ(@yh'«Ô¥”õùjÅ.B1)ÿ‡P´ #¥tü7Èï'gÂÁz0‡÷Cýõ“¯š 3w½å"wÄñÓôÀÂ×Yáñݱ«ô(¥oÞ”;Õ]?‡|ôp2îÕ%;'yvÌTœ'í®ÓÒ”:.–zˆ”O ‡,TƒŠÆË§“uÄ$k¿gªýdòè2̧ñJÏ ÓÅâR!prBù.?œI—J ³pªâ’ët>b-ç$\]û3õ‡®z,¾Ô;²î,Äê¡öU'3S8Óui'~ÙYP&ÜŠÇÛá[®W“vS_ªŽ.µ„÷L–ˆ>ïýPáó+2qûgîŠU57oÓè¢>õ’Zq>øÐËKŽÏ;\ ½í£‡‹›_¯E®£‹™¾¸­ç»¦=táˆD…ºi7¹³…ˆëoT”ŸÓå¡DlWÜš‰­Ò™°?Ihöpdfí­ˆ¹óv¦üÌpöµ¬íT¾Eÿ)W:6ܲù”Ì×]¦·’m„³„뮞ܨðÑ@+dÛ†hËfÃɾðÇùÅ—"–¾É>„»þdBÍž¤k*¹<:IoŠ&Á‘Âa¼ ¿Ï ´îç‹dÇç —¯É÷Ûê:Ë‘6óEÍíç{HW‹”ߎ;†ó1© ’â„jgªw†C™ŸÎþ cÆ÷endstream endobj 187 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 368 >> stream xœcd`ab`ddäóñ NÌ+64ÐuÊÏI‰¨üfü!ÃôC–¹»û§âO/Önæn–Cß/}÷üîÉÿÝM€™‘1<%Ç9¿ ²(3=£DÁÈÀÀXWHZ*$U*8é)x%&gç—gg*$æ¥(xéùê)øå—34òó’R3sÒòÓBR#Bƒ]ƒ‚܃üC‚5õP\ã0000103012²Ô_Ã÷Ÿiß †eßO_þ^úPèÙw•îï*ßù¿Ë‹ ëüT\)úÛîû¶S³^mìþ. ù=òwnwœÜï6á/éõ iò^±§O«ß ·›mãÔëä¿ÏþÎÌþÝâ÷æ™ÅÓºvKc›?§{¥üoíi¢µ¡¿ùå~‹}/ý.ÆöcA¬§<_éÂqs¾g.ïëa»Ìõ]†[Ž‹9\Äž‡³›‡ûÀ¼‰{zúú{&öõðð¼›>Èòû&ôñð20“gŽßendstream endobj 188 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 328 >> stream xœcd`ab`ddóñõÍÏËÎIÌ+14Ð JM/ÍI,ɨüfü!ÃôC–¹»û‡ÖO&Önæn–ßw }/üžÇÿ=[€…‘1<§²Ã9¿ ²(3=£DÁÈÀÀXWHZ*$U*8é)x%&gç—gg*$æ¥(xéùê)øå—34òó’R3sÒòÓBR#Bƒ]ƒ‚܃üC‚5õ°: E°°4¿$µ83/='U¯¤ØQ±‹‰‘‘Ååû¾ ¿,û¾«œñ‡Æ›¢½ kæ•ts´±•t•Wµ–4øty5{w7¦mê^Þ=y]߂ީÓL?4ó@ï侩=“9ø¦ýpžöÝvZÿ4¶\¸å¸XBòy8»y¸7ΞØæ÷Oäá9Ü;­gú¤ž©'.›ÊÃËÀlŒ€¤endstream endobj 189 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 676 >> stream xœm]HSaÆß·³×¶fIC%ÛŽ bÐÖ4Hm ˆ`š󣻘Óá>dnÎik[ÛIØ{öq6jÌ (d]Ô®ŠÀ‚ ¼ð¢`”]ÞEñn;3›utó\üþ<Ïó‡€w @‹Û;:´Ö1Ã8h6LÖ+zFFm­åȪLŸé²cé³úÕ™u¥c|$&˜÷"SV„ý§°§Ïž$„ÆY:0ßlžpXô£cVªV¥º¨PäµtPMJªM;4n¶OŽë)­i˜jSv(©kf{ê©j³‰Ót”YGõŽ\§ú4-=ªµ§³¯KsNùÿzÿR­Åb¶ÿ‰Ö›tz“Þê°h‡õCZ€Êk&xýAðó£óì<¸ Ї×%‡ÄeÀö$ÌXqPºfCNYn—tÚÕGKòô.¹GkrÉ!¯Ê "S˜NbÚSSÙ&;‘uæO;ÇÒ Ç[¯ß·á?K‡}H0CziÚ-_Q=W¿ël7}.·;âZ–g6ÈÆþõŒJàfé¨l…Œ 6̰q\ðqóÖY&Ä"Vð7γ™mÂW‰¬8Ad]Ø Å¤\aÅ…Öê6YkÊŒ÷»Ÿ¶ßëENRÇNÈ‘)ŽÀ…?öw¾¾•ï¨ôprëÆ›é—H€%{`¡ÜÌH«®4_ª½šÂüÙ£×~bQÞ…[•uòœÝ*Õu6”syÂÁîï{ßÞï~ú¼­æø_ò lF¥Ö¤‹ž…[ιÛnZ–ë;ฮt±oùN€F¥ÑÈí­h.qy‘!s±²ígX—k‰Î†Ñ<*]EA6²”žÎ6–°1&p4Ô³ð$œ)J<Ž“IaR$§ÅÇ‘X”ÂQ† 1a&&'‚Ì|ˆY…¢F|€ßïN%àendstream endobj 190 0 obj << /Filter /FlateDecode /Length 203 >> stream xœ]±! †wž‚78àbr—˜.º8hŒúÅ0È<ßÞ¶§_“(éßn³ÛîJžuwlS8ã¬S.±ácz¶€úŠ·\”u:æ0Lj¸ûªºÍÞ×Ë«¢¦˜?ø;v'ç¬Ù¥)LÕl¾ÜP­uJ °Ä¿«ai¸¦ÏK7€` UÒÒ‘´§c¨’ZH-«Ô±ö ö¬+HW¬Ò(ƒ}Gà9í7œÏְ̲‰ÌIsÁßÖêT¹Kê :oiendstream endobj 191 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1176 >> stream xœ]R{LSwþ]Ší¥TF{WŒˆ÷Þèæ4VpƹÁt*ê`ÊK ‡H¡€\'•Ry”× ôÔk±Pd¶§j6 ŠþÊ~[\Éôíœä$çû’/ßyPÈÛ Q¥ü8&NØ•žÿNH\fÖÞ¼ô=³à÷Êäå^("ÎÔÏTÎ…ÞÃAÞ­*¬SâäWp¬?’PÔÖ,a°Û¸G—•­çÃ5šå!!žú.¿Ãȯå7¦gä †‚\Ÿž¿“ßÊÇ ¨ã— ùüŽÌìô<-/hù„Ìd>1~m\<¿>î“ÄÍñËBÿoëe¢Ã—¯xé2 B*Ä WQb‘’#%òñÌ„¼Ñt*òzÛËä5.Y!9]~Ͻ˜(.wë’¦›w|€+[l¶÷rî!Ywu7»##© èY7œ‡ïºé¿eZ³)˜ÍΑö‰·ákOþ }fú…ØÏøÑô.Õðt̃íÓ8àÁ<¦Ûý^¯Î“š U)¦¢Ï«"¡h²NŠ`¿ÇYWKóü‹£Fà7û¾q(Yf3Q¬Ò„§ž®nn?é8Å19C)`b_ý¾ë ï ¬Z¹xu$‘“¹Q‘€9L½©êöº9é¿ O\Å|êq–À1Õµ©ž¤>±Nµ?™Çø#÷>©†_6Œ¿ÞqÓyá¸E3Áå·ÂFó["µ]ÅÇN¶uïÍmÞkeÏŽ\[fTÃÇÆ«^[›Ÿ^ZÌíÊÓ×ÅÖYª,PF—‚#ì ôæà–EsåGÚ¤„¨¶álö«®NÇŒDõè;sw û2‚§b°Ï¿7ùˆ}iqúá² <çÄ€«'z ªg.ûä‰É/&ç1Cž}mSczåc"OÙV¬Ëdq¢¬©öLÅY ±rüŽãpµXµPSÉí,I3%ÂfHuäÙ+lf Ë ÜÈ‘~™L- âkwœ:7ßBwÚ¡¢#YûÓ`'h-‰Âö¢]yI°6õéÇhf¸\´Ô:;ZOöæ7Œ¹Ÿ†ÝÐ`Çðýûs~Ï%Z„çöãˆ~êÂÌVÉL=v«;  „ýÛGZRz}8¸¥ÔÑÉöî4ÌrJi‰ÁÃå|¤Ž£Îï9ÕºcáŸ%êñ˜?%•j8`±–5‘…X­Ã±€ß܇}ñ‚sýÍMV+Øh[m}EqJreK /h úû$½I7ØÁþ_]lö_Ä¢ci –§Nj~2]a®®©…:»‰Ã<™ßC6 r†ø’ ä´²2‹j豺±eðÜ¡bÞ‰£+^üx¡sFî¤úîâλw)¾¢†gåc9—¶ß‰èH¢‚´R!kuÝRØ Ä%ïõx­hà¶cðaïñ.ŒÑávµçla¦øÂEëJs@ëZ §ËGá> ÁeøñðHûÔÆ.ø.ïkÓØ ÖÓ~…íî5,46´K]òq_Vî (|@áë´Î†ÍfÝß0ªP8EG·x°^Üo³TÌEè8f-Eendstream endobj 192 0 obj << /Filter /FlateDecode /Length 225 >> stream xœ]Anà E÷œ‚ÆUœH›t“E«ªÉ0 ‹`DœEoß™!‰ª.žågþXÃÇ÷cÉ«¾ÚN¸ê”Klx[î- žñ’‹² cëÃ䮾ªáðáëù§¢¦¦îŸþŠÃ7˜Q>Ù>–ˆ·ê6_.¨öƸ}JNa‰ÿެésúe,8Rë:fžH-½2˺sÀÛ–¶®c£aå“(ÿj'dH9¼ñN0f ¤­0õ5¼ìý\¯Àe<ï®Ã½5,«4&p¹à«ÔºTžÒ„úL p&endstream endobj 193 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1283 >> stream xœ•S]pUÞMBX T`ìLªu“q´jCI; Õ¡­uÀÓ–ùé”@#iR’¶IKÓü4äï4›¤ÝnÚ2¤…:´0ÎÑŠŠh™AÇtD}Å>ð‚wÓÅ›¤2úàÞݽçÜï|ç;ç„DD$)£ªJÓÜPÓÖ¨5,ËŠ «u{[ sÚWÀ?Iòù"þ)1L×N•%ݳ@&™ä³|©túc!ºòº¸€‘ä£%Î~ùõ×ÊLMmfýÞ†f¥º¨¨¸°Û—”Ú6å•r­¦~ŸÉjÙ§WjŒ»•kUU*åz“ê•‹MF¥V× 1ìQšö(ku[•›j*ªk”•Õ6m¬Y¢úškŒ{µfŒ§k6èö4?üËðјÍ&ën­!ãºÿu45™M6Ýþ}+~ëu:ƒ®Qgl6kvëë5†£¾Ug¶h AÈôä[Äâ%y ÕM/dÂLì$Ž‘ÝdˆdÈ0!£d1 LH°#A|OJÈÈ3¢×E“âõâ$´Ä‹ÞɹGznB[ëT‡•D"d£kB{.D½1¡œ×Ê6‘Dò87ëìô¹>Z(Oi½8ˆqèÁˆ•¥vÉ#Æ5DzœâÀi܈y€[Æï’{cþ>;PN·Û™AP Œ9×ɺ¹þ0Ë…é 0jî½y—üù®ÕbÄ1ˈÑh±#–±±‘‘1:ò ¢y 1*s§Jg@Üj›ž.mÛÐÄp´xÎjOɵmÈv:uZj·Õ‡Z:‡!EÎT‡¯©H•@j+9U† ÓÁt*%=èìÛqrÇQ+;Ì~xô£“±¾ŠOIñå4¨"u]zùFüs`¨˜ÜlsÑ[Ÿ[Z ¨ë~oº +àü¨¤î—‚‹8BÁ°?‚«¦Xb`;_zSÁ_ÿw6kÒÒözCNF(_vgÛ¯Î8„Ý>Æ‹¥¤°ÀˆW_V§IܯlPÉ‚ô»Î4œir·ºw6oop¸p(\TÇß \—–ÛjÁO98`¡ûp}ö÷[wz<ÆDBÐKe5œ˜¸2q ?äÄ(wTœÔñ[s‡=¬Çåowi_e…fl€ºã•ã»F7Ÿ\ÔÒÕª–ž®Ž9QD~ºzü¸ãëÞ7kø ¨[ß}ó›Bè” {ú<Î@{GöVWm/ÿ “ß^º©È|7#— wZÇo¼ßéÛ3ô˜Ì4K‘’K²œ¡Áí¬îh³ä‘{}9÷Dƒ'ˆúž¥ô8]}OÌÿhͦŠ¥‚„Ù·è Š_™‰ÏÅJi 壹“((TòÐ!¬ %Â3BŽðŠPŠž  ´üA"ñêMÄôªÌ€_J‹““C¹\ëpø=ŽƒtêåiBxÏ÷õ¢Èóãátw-~Uîtƒà£AüÊìéÆendstream endobj 194 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 454 >> stream xœcd`ab`ddôñ ÊÏM̳РJM/ÍI, ªüfü!ÃôC–¹»ûGáO]Önæn–? „¾‡ ~àÿî#ÀÀÌÈžžïœ_PY”™žQ¢`d``¬« $-’*œô¼“³óË‹³3óR¼ô|õüòË‚™ ùy I©‰9i ùi !© ¡Á®AÁ îAþ¡Ášz莂ñ˜ „„Aö³^ý¾†ï?“°C÷š«×œ.gü^‹ùG°Øš vŽéäìg_ÖÙS —”V¬Ó͑ž¬û`÷Ñe¦²§uÔëÈed±mé{ؽuoéà€v÷ûû/o×øâû*þËw±WâÂË~~wÍaë(oެ¯hm¶ï®îæøíÆö]ú;ßìY[×Ìž)yòȱCÝÏ8¾s«ßø-('ð›ÇÆÀ(jSËÌ«fm”ÎÚÙ]/·âʹ%{º9^ì¶1Wv²ÿÍõ›Wþ·Ðo1VáIõ ÝER?äÙøÊüpžõ=êälk¸®sËq±„äópvóp/ï zz'ááYÞ7kYßÄI}½&Läáe`àn¶cendstream endobj 195 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 400 >> stream xœcd`ab`dd÷ñõM,Éð,IÌÉL64Ò JM/ÍI,I©ÿfü!ÃôC–¹»ñÇÞά=<ŒÝ<ÌÝ<,~0 }ÏüžÎÿ=E€…‘1<·ºÖ9¿ ²(3=£DÁÈÀÀXWHZ*$U*8é)x%&gç—gg*$æ¥(xéùê)øå—34òó’R3sÒòÓBR#Bƒ]ƒ‚܃üC‚5õ°;U´ “Q’±‹‰‘‘eÒ÷5|ÿ™´ó¦•ý?ÈøýÎNf óuEVtWÊý¾ËVÒÙU˜—ÖÝÊÑ:¡s⤞¾‰äößÝß½¤›ã[©C‘‰åoçæêîN ‚²¹mSVL^ºuºÜì}ݽS7ý^&ñ•­à7K•S·5Gm÷o†- æÎ›3¡»·e–\Á…î‡Ý“º'v_Zð”ã; ÛŒ5Ý«åùÊüpž:mÚ÷‚l+¸ŽqËq±„äópvópÏëéííëÚ?siÏüÞµ}=z§÷ööôòð20î¡_endstream endobj 196 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 727 >> stream xœu]HSqÆÿÇ}tÊef,èëœC`T¢YåE7fŠ•Ùœ¦ô±˜s–íèÑZ¦n†Î¹Þ£Î6?¦›¢[æ4¢iEQ+'Q7]uWýO‚ŽE½/<ÏÍïyÉ£A±‡²²X»=91³Z_^bXôâ…u„°>JØ ‘^ ™ PÉ@%¿ûÕ‡­Äšø`,’D~±i[QÕœ>SÍìHNÞ™˜(ý¦°†IMbè e¬¹ª¬„Ñ›Š˜IYIÌaÖ,™%ÌfÖÄÏèË‹¶˜É50yÚý9Z&#';ïˆvKÒ?¡þH„¼‚3Ò -JCéH!•@rä!VVâÆC"ÆÛÂøE˜pEð·ˆLhÇSêw'ž¦(b9–ªžÓµZ@[_y¡¬þ(4íæ±+­î@Õ1ÜsϤ—çš[ÖËvZŒù^§8­´˜ ” @”}~*ÀBë”38ŸwŒïÀŒ>ã­˜¡Ó[Õâ’Ý"™}ªiÞ‡opô£©^Ž’rõâ„PûA&¼ÄïÕóiÁÔšÐäQ–«¥~ œ¸Éþ+J[ÏPÝ=å €ìöÚY8ìut†è·×ZÖ˜û-ž€sà¶›òc4ò<07Ÿž…¸îðž³5[#«k‡‚îÙE²í×xC—JðÑjÏ…ÁÚ†&[‹2×”²bæ=ð?½ðØëÝtSó¥F¨"+¼ߘoäÚÝã7÷‰j1N\'ÒŸa¼œºa¸c0 sü­Þ~ç‚4 ù´6Œ¥–˜Šà¦ÈÿX) ÅæùA:¨\€ÇÝÓž×OÀG>,¥Š+%Ð*1^ã-ôWR¡“!˜þ“‚Ýê´Ö]ÔYåä«g3€œ¾XIÇ4¸„L'Þënã•áe‘hj™<—U-Ut¨_¼vÞÕåT©îóíÎVI¶ñžNÕr„~ìú_ƒendstream endobj 197 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 442 >> stream xœcd`ab`ddôñ ÊÏMÌ3Ó JM/ÍI, ªüfü!ÃôC–¹»ûǺŸº¬Ý<ÌÝ<,~( }üÀÿÝG€™‘1<=ß9¿ ²(3=£DÁÈÀÀXWHZ*$U*8é)x%&gç—gg*$æ¥(xéùê)øå—34òó’R3sÒòÓBR#Bƒ]ƒ‚܃üC‚5õÐã3000101ƒìg <þ} ߦd)†îM?æo:]Îø}éCæ½b›ØUºg¬‘ÿ±‹}e{w®œ§·jwz7G ûÒî³ÝÇ—süéeÏê®S‘KHa;Ô³û0Þì>ÔÎ5ìé÷çßžlb¼üáûÔÌ?Ö}÷Mcë¬mô¬ihiµê®íæøíÏö]äóÚeON¯Z)¹rå–}Ý—8¾ þf½ò[ê·¨¡™nĶÖiKVÌ]¿°nu¼Ü¢}'6^èæørØÖÊ%ÆÉÕ[þwãïÜÆÆ®®îÉîl|e ~8Ïúž?uò¶M\÷¸å¸XBòy8»y¸W÷ôöôõôNêé|œ‡gCïæþžþI=ýSz§òð20ºÇ´=endstream endobj 198 0 obj << /Filter /FlateDecode /Length 401 >> stream xœ]’±nã0D{}…þÀ”¼ÞuƒMÒ¤¸àp¹P(*PYíâþ>3ã$ÅCàY"ùÆÚÝãóÓó2_ÛÝïí\^ëµæeÜêå|ÛJmßêû¼4]ߎs¹~‘Öò1¬Íîñ×°þý·Ö/ÔéÎ/ÃGÝýéS§Ÿºû¦rëeJ݆å½6§”òišrS—ñ¿Gûã}ÇÛôõj‡WœX2°Ë pö%+)õ|ÚYêé” .;í±I +°Ï °'î³Ü-+@#²<=+@'>dø4\bºÈx‘áÓQÆ£ ûL{{-² "Ú˜Ú˜ðO0)amNŽK\9/r´q5r6r´q5r6r(¸4œŽ6®FÎF#—•ÓÊY‰(ç*è,ètI:%‚.I§¤×¬+_Àõœ_! ª¬ð 9¾!ç sÀ7ätø†œƒÎÁdP2 ’ÄÊÙú"Žö{>ÛrÛ¶º\5ÕšZë¼ÔŸÁ_Ï+wµHó ÊŠendstream endobj 199 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4207 >> stream xœW XSWÚ¾1{UDåíÜ0*–ºPÔjµ‹¥Z¥¢(Å A‘ˆì°/R!F–$_BdO\DpŠRÅ¥Åej[fìò[uDiµZjÇséqþùO;ý;íôù.äyr9÷œoy¿÷}¯ˆ²A‰D¢ñ+}ý•±ò¸…³üÃ"RòDëÍiÂ$‘ðÜábÀ?:©mÁN v6§ž› r@gÆ£Ô±hÕ8J,mˆP.QÆg$FED&»Îñôœ;kù\èº5Ãu±‡«<4F™–å*ÛæêãáëáºJ™FnF¹º+ã\·†EÊá®Êp×µa®ëÖ,õ_ãêí¿zßš<~Ö³ïEM{3NÿVâ²$ïäyúÖ•¡¾ÛÂÂý"£±³çÌ}iÞøù ÇÍœõ"EM¦VS~Ô;”µ†zžZK¹Së¨õÔbj#µ„šERoQÔRjåMͦ–S>”/µŠr Xj%¥©4ʉšHEQc({jõ<©eC©EcEI#D#bG\¯±±±ÙgóÀÖÇöº¤‰v§ße™Ô‘F¶Œr¥=rtùè!»EcìÇùÈ>ÅþòXݸ±ãNŒß8þ®ƒ»ƒ—ƒ í·ÿ§xO‚x!(M4”ìÈo§}AU²Ó‚Ó†hç¼rÍîLÈmnn&Žy|Û9;:9r‘ŽQÐ ¡­Æ™§ýõÛy¨†C¡¡ð’:£2É)<øS¯<—Ø5À)è£'¡ ìŒJ¥X%A£Ð¶öÂÇÀ“Ãoó;LȦ…÷9±*á=Gžf×@"èx­¥á4)$[ÂÊ7‚„,Û¡dt÷$lvSÙ*èKre¸†Þ¬‚åäœc†jýq8åº-ÃÓËUÐ%C>4[ò÷¿œ¼ðayàjgþêZûŽݤTaºIÔtµÝ é(JŠœ¦<Äc1;ÍOÀ㺣±ˆýî;4–›W"…px'q‹róæ49l¹)ùPB‡®‡¤ÙgMGšO¼_ÑgáHLMT½\r†$Œ×óh¦ õ[jùí‡G}¨î†ë.ìG )rxáµncÊÖ0îÍ>ÂîÖü®å†ÈGþÇüÒæ„Öè€A£Ñˆ»ÈI6ÏK¼ç¾f>ÄeÕ€ªO³£>h=]Ó1é³ÞÙ˜’Ù™ñ"4ù¦0å¾x(Ý’",C³ñ[ÜcFQ/¹jP…Ë×ÑáZÕ".Y!0ô&šŒÜ‘ŸÌݶÂäµK7x/I]IKI6i‹[eBÝj(>Æ=’܃ހƈ÷Þ©Xî$ói¤Ñ½5¼¢ÃáÑ•Gsbý„‘Â8iKlsðj¹Ü7™Ó=”°÷ðä_éi¡\K°–F/Ö”¶ËÐtúH)zI8­ÕefC_»½¾¶¾¢™#¬î³búºxäÚýˆ² )'öû!Z’*QŠíã~J¯úYz’£çI÷Ãm8 aøÚ3¿Œœ¥¥Ù¸~ɽҘù2 ªRJæ«b¦s³Q¡äI¢ÈA‚fiM%æ†D{Â)• ILÈ\'j=²Nˆ š …£i)õQû#ŠßÜ›P¸¸Î2-õ·U¼ ÑÀé³!·˜½P\-»Kì<-dgqZ­Z›§¨SEYG'zq@ÌÞ„úY«â`Î õ‰û4uÛ÷ì2¥C3wìpK¸~*›ÓìÑe³veÈðz;¨ËŠôúê*ÎXTZ^XرµKc"HÛùÉ%™ÿi**…GY¼0•¼ûÅCù(_ÊÓ>¬‡m0" E =P.[Ic{<²b¿nÔŽZOϵû?xáù œ!KŸG’¨„ÂZÊz’EŽF£Îå¼bxÿ3ÓÀ¯Ç ð<ŒCÐËø%ðõ'mÝÙ¾ø¶È=À”BI¥ yч…—HEÆvë0²¥¥·H¿Aß qÒ³Êuô›Šˆˆ·áoUjFn!á ¹·¤g”kilŒˆ€ã•ZBNh >¾?¨b#0//•¯PÔn77Vט;ƒ AÖh>^Ò̉³aseÑô:­WÞÛ1K"S6@(êÞ‹¿tíàiË^Ž],/lŠèœdºPñ… />)eMÓ½b·lÚÒúþGgÿŒfYç€SZçàßÌ‹I7b!Å‚Ð+Î9%„ÈÏg÷vïæ[[Îé ›Äiâ! BIËé mù.HƒLµ*/wÅkίßÏ)Ñ ØÊJËê­ëô º`²‰l³®¿ m—ß÷Xê<ܸÚ_› . º‰(E´@‹®ÅÊX‰š}° `oEUon65>͹:´ ªYIVqé04è;ɾÂ!•4ÉD}mj7¡ðÑ£+ÈD¨ù _ŽwÿÛyoŠŒOâÐ%ú)]>éáã Ý~Žßò¾ò¸üĉz)lÊ]Ÿš³U±‚!¬!©}G-è­Ü¸…&¦/­líê®<p8É,7‡ü Æ* joj˜)]ûÅÂ7D”Õ´Ø{óÒ0ñ‘#e·¹^©ñ„PØ ¾LÊROÿ’E›$O{ƒå¦³¼ âj®ïºîÄ6 û„©dðb4 È%(ôJ)F—" Tù;ówMÃjglƒ*r U¸˜[¡–ãi,ÖhÀŸô€Tû(TkËâќǴs¢_Êú8opI„íåÃ~·[oÙÝ:Ñœ^™œ˜‘Ü~òOœnàÐráÕRsÕ‘‹2yçΓÉCm·›,¢ÖhË€Xx––©€‚v{.—¼lMB0+ž$BàùűÞòSÚÄvYj~ÚˆcjÒÌæÚ}üù¥çâ 3\ñx,}øÑ{Y SÂÙÿ¸x¸”nü^Xþ¥øGGG>™^¤%´.ÔÑí†Ò«\=_“¤BädàäÇq²Ð»«Fgˆ'òÚO¼GÇCчӆ½ún¢‰ºSV„¹ÁñF™ÐBëõH÷ª0˨.—R(,1– ‚!;g½Îöñ¥Ÿ8¿·àT@ôÁ…a¬%v(ø:t µ©•`ΪX¤{n¼uʼnu-ÚŸñ†ðf7øý v8ŠÎ+ îypõX×°0 þôhgm•lͺSÈɆ̖æÝT†- VlN¡  ÚɈ+ê1®k9Â÷@Nm +ˤ[uåüLkS"Т'öDóñÓ®ç©wjròu\”Ûí»[“[£»u½ÐÁ ƒ’ºB¨ý~Í7Ä»ØÍš‚Ça§žGöȾûQ½ÌM”â|I ò说Àiè•ëñëQ¯Œ"hly”Ï'_f{no9±S…CöÒƒaû×rì¹×ú=/ÃôkŠÏñ_ÿƒL÷!†Ç£‘-ÍN¸Ý}´“c'ï=Ú=ÊD³™„ê ScUµÙÊUÇCÈ©J‚; ºÀ;„~$:$r¥÷§ÞÄ2ãs$¶@A³« Žž®Iì‰.8G‰rà e£Wiä:xó®ÌÍ1ðü ‡§¢º§Â}W‚’{Á²g6 7ûN4ú×èÛ©XÃèÐ] Ûùsî©ü+úûFTôÕÓ(:!Êá¢^&Ð3¡"ŽO~á!™ ¦Ù³xªõÌ‹%¹xµÏv:j¨Õ¿•>݆u^#<6'5ÄÆ&%ÅÆ6$5774X ÒÓÈZ³µ%{·£½ŽÃ ÿ ÙË¿™Oƒ}ºnk”†jؾ'š† |„õ׉Íê³VnÃÏ*w,Ñí ;¶!5´ló¤%(W®Ïþ0´íex7¤nftßJXËÿÉÒõÙû½§«¶-ý­Rþkñï.}ªá¤êíüÅ4J»*Þr$ÐCC, p†6é ‰œïŠA„“«áœ23÷Òášl.F!i+¸GÈÕmšg›}ò¢Q̱°-%²¡ÍÚå—•™«^F„•ÁË$÷¿F Ðäs=0è‚è™_W úuOÏy%uÍ•mÍ©uŠ< èò¹†+[N3x`æ2·E ‚6Èð ¨"„ É.;lAR,Ÿ# M6'Xóà¼É¡‰Â(‰.Q²S Ñh‘n.ë›Q;pà½Oá2su~ï”)¯û½]—ÞÔT[Ûı $UDqæŽs5ÝÀ\«\¾)67(1L¦ŽÔÆiöf6Q »&©u»t b²vÃ>î˜äæÁ¥3ñôé…}Á²¶<‹ Z™ý‰µq‰±ïÊç ,C ?Ð?È=+3šÈ )¤Îçú¬¯Y ¥¼›H×@qz¶N·CÍá?=·U óši7ì„Ù;3í§‡{:«¸k°8Ä?9À¸?3JØï½vkí><ÑœQ£T¦gÄ.ï éGRr9#%çqGº8zʬÌ@8C&D•~ºO$Ìñ~íÁæ‡ÊÛàch\fܹ7ܸ B˜áv>GFq]šC²OGö‰ÈÞ‰½ŒiczcdVV¾ZE^ï´:kS´E%5Ÿ;~Tf0@!S˜[œÃ±µ;ç{a»fyÇêÆFië¿=ÉúýƳšÿýìSÆÇ^Ãó!è 5H/'´o{†SE%DÃÂ7–pùyG¶¶£ôË«h”U.Ö—QÈ÷¼¨5ŠÑAä+=}é§À©?¾›&:+L ›†ÒŠìbuf¾*;ŸÃƒÿ½H£ÖæC¾Ë»e9%•ÆÒ2#‡\TPb0‚ÑÅ>¥NX²Å•ÕIøQý£¹Q6k×n± v£ôrÉkkñvv–Óîâ‚2c±°Èn Eý ú‹ƒendstream endobj 200 0 obj << /Filter /FlateDecode /Length 3460 >> stream xœåYIoǾó”s#$ª‘8ÍÚÛ2 †“ÀB…9il )©ŽgÓôha,ÿÛü|¯ª—ªaS:å’ˆ"ØK-ï}oû^õ›S^‰SN?ÝßWë~zsòæDħ§ÝŸWëÓo/NÎ_'UàAœ^\Ÿ¤)âTZ]qmNqUPæôb}ò’=¯÷‡f3›+%ñвçÿ~5“¶ :hözÆ+n”<°Õ7AZ#ÛÏ~ºø ¶Q*ßFÒ²Æ`«‹«ffÿ$IÄi¨‚•–F̵§se*o- zÉ^|3›©«$ûãvÓìÁ®y°˜u;@Úqº€XŸ^üpÂÄìÞZ¿å•¶¸ ¤òòh¥¼’..½×®C­ýâñ4Ì«í¼èÿ;xyeƒÚ Ï AŃN*)¤ÐÆ gõJLú½ð•Á0òKÂú}Šíel9›ÓwÚ"lp§î­a·3éikͶoÓÓ`$[×ñ±ðÒX!Ù& Ãí¡_Ä9VãÒ9ØU6¦ßTxëÙu|a‚öžÕoó€>t³êŽfÀJ’¸TÎqÅ^å u@GQU4Cœ­U‚= k AšØàl6×\G˜ën:æ_æÃzI¼eë툒d‡<Õ›n˜ôìM®Iï¹ÏßìÊÖ­k‹çû®¤2\ÑJש<=‹öª‚u}oïËÌÜo³kRJ©¤÷ªÝÒ¡z¥Ò¨z9ç]"W£M€ãL`ˆöšÁ©ãx)a® ãÒ31NÑÛR°9/¯¤¶¡¶:¢OòXK"¡{Ø»™Ám³ª/ñŒ#aÁ¥öK‘ã–Ñ5é¡¥pä™äY_ÎúÐ÷èñ•í1eÅ.fô3Y… ’ÊX_HŽ·-¥(Á59q'ɘ²–«z×.¯R2ê³d™€1w‘ñ–—·b–.+Ò䨈ÿÉJ '}®ÿ…R*‚–¼S9ƒ ½äÁiLTÜya5’„·’û€`•ž+ijQpsá¸uÁ£nxî‰.I)ÖjÇv"d¡¥B…As/¤×^`®¦íµàÒqáë!{›`1QJdñ`tP<*Ë"/ /âÎk ‚ i5ÜB"¥œ·•Ëé§ަW U ·ð\£’¦ i€r'aÁB:å$Š ãЂ[%ŒÁ†)PÀ‚ÿÐ_i4ÖvÂ(@‰=ñ p,ÄVDn Œ5¤ÄÐiÇD¿äLM#tW®LJ±Dj6¤.„ÄŠ57Bx,É!£\€°±Ná=¦KHíƒ@²Â+‚ü"dð òáWj8hCqE¤×*b©¡3°rœÒ–’áEÑ(HãÀ$dp»÷ A€©ŽÊp²;b¬øqi•±Üc ˆæ, YÂLYìæ¼ƒÏXx¨úÀ…ÅÉÕpHKèâWM6…Ö Dˆ‹=œna‚Ð38§iS ,‰­ Cˆÿ<ÌœGò äêÁA18-ÙÃFe€¦° ï×RÙÀ'BF*€/&·ó†+( #Á4ðÁ)¹*THy„þ"t1Ý ˆn JB ÜKarˆ18\Úƒ! ”0j Þ£€ÞÄ  „Ÿ 4AÚEJëá¢Ð˜H Ä5l7„Í l²Œ“u°$qÏPe¥aë$œ¤"&´¸ª,§)mW?%¸éÆ Áž§… Á®sÒÒ‹R·o š´.øÌ¡)HÜ—³9ÒPäÝôÂ/‹z€k¾oR통ءXiÛÉjð÷l¿\‘MF6sR–h- Ìbç´Õ`N•Ͳ?ÕèäòŽ}»Ý¿Š,Üøõ} wŸÙê^Ü6Ïë¨ÝUÉœŽ8Ýt Y2xV°µDÏQEÞ ü̋Ηƒ׉ӴîwOŽò¡.¬p˜M±5ï*dßO³5QÜ­θÍ}hà`ZXb¢QBQð´®•ùú&TZÚ¡ ¿XçD9ï$¦O”¨4"½ŸNÌß^¬°ïU’9æÞõªùW~_¼Ìf•]A¯×)¾h eï²Ítßæ ì(‡Y˜Âôz¿Y°]sÖѰpiìÀK  Ô#§™CSÞf«#œ£Â-¨ ùb'ÊŒº}RrôËÙœâÂR批#\Æl1>n·«\ýCSxÊuEFBhg“h@ §tç—»fÒ1AŠQgz­jR|Êa‡£ÀÏÏy¨ö¹ÓdÐí>Û´õ}*µJ¨91‘p²¹Ø¹zMë»x¼EÙå(‹ŒƒŒú|keÑ8û™Ö KÕQDCb£{ÓZ>¾èJ3 ‹îtuÛ­ ÿ¬É?l<Ð+°<È3£úë;ÝxôGÔc$‘üÑtJôHÇóŒâ&o}÷u<¥*žR,zÝÓKÒ]ÒY£);á•F¨æ™tês¤”†ØðuÖ¬O¥ÆÙë£ 0Tð;¥dË8Nùq]PÅíjÕIdüþØåâBP"Ÿñ6+ô÷f¡#I#&J2 ÊX(T//ÈYÛËUžà¥£Œyo»²PÖi$ú*è¿ËòÊêö»–é îû:OZmûˆ^©t˜´K6ײ$rã:ÔÅm¾ØªÞw‹Ûg ~¥Ù÷Ïç—ùyl{×®Š>½ g>KTÓBÌçÈ Í_>e|6ÿ´Ú'‰ÿüûei‰rðžFÇMPUž/ï͘§nß#~÷¤u¿­k§ˆÉƒ¬Gìú%hý{¨WB?B‘Õ­˜(ä‰ŽÔW÷Ï^0سþ$Q‹’ÜÙJötæ%û19ºcÛ`£RÝоFÆàðšÒŸÑ‘e>›™ø%,Zf2¹êú ~úª“ ‹þy³%Ì"`ŽÛŠ”PãPkËóí{;œ&ÊX“<zè¾0¼[î/·ð¿‰ò Uesã™ðMªS9 -:;œ%‰ã‰g>äC‘ïJ·È°UZÅt3ä½ôý¤NI'ž#“–íO~r®,¥©xrî8‰:¨ßôÇìú®«ÅÅÑ0®š›×q vˆäª;§/ìQDÁ<WƒèwH0} 0Ô§ a~;¨S@n{ [§J#Ù ‚ÏêÐû<<¿œ:$N'æ¡ïmóÓá]óœÎn‡×ü¸üúíæὈg¯OÑñ uU‘eöëúCÿÀ²§}o$èDýläá|D—ÞÝv Á wÄõ¢ÏT#€ {5Yl·o6 xО~!¯ÎÆÅwÍÏc„eÎñE›åÊÕ¼úxþ±úøô‹åb±yÐ}EÆ[s'ó5‡lâõ9öð<> »‚è5Hʆ¥ÁóòÓåÙ(˜GÜï†Ošó{v¿ÎÝ©¾l±oš›gŽNº–?/ØÈUÿj5iÁœÔø7Ò–\+OæËWí´_§ñ¡Cóùÿ¸ÈÒ8oG¸î Oæ’öI\ä\f*ñž°N*"õïÃóá{ynï»$„s†Lè`œ«å`,¤Þ~m÷ý÷ñ›·õ™èŠâíã^Yv]·‰R~wqò7üüÂ:È…endstream endobj 201 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1940 >> stream xœ}U PçßÜ[Qo½ÂHº{­Ž@Q|&bbã#åÌ!OQ0œò8„;8<ï@†þÇSðäy¥<ê›–L4VÜ65g/$&•NcƒHbš&~›ù˜i÷ØÇÌÎÎ~;ßþÿ¿×÷_áâDˆD¢Åo*µfíºUa±ñº¤­ãå ÞSÄ¿äÄÿÔ¹kùÆäsÀÕ\]n¾47G‚N-FÊ…(xá,í×hRÒµªø„£²ukÖ¬_µJ¸o’)ÓeÛýdò˜CG4ú´#*YŒú°Lî§ð“kôÂK•Ì[£–)cb’âdš8YDì[²Èð7ÂÂea»#CÂ}ü^„5µ&B¢Ö¤¤jÓt1‡‡ƒcãTÉÞ>±›!B‰0"œˆ öÛ‰„ñ±šØIr"˜˜KÌ#h1áB¼Kôж‹®9y9Ýr^ï|ÇeƒËàœÐ9÷Émd‡ØMÜC- ”¨Óí_NNUpÈÎíå$Ol(ÂæNÿŽ?Õ&mK…,F‰rȯ¢z6Œ5d0ôÇ¡úDf¥‚ZÝ ÕìUlWN¯YÝ mŽ/Y% "é¶1{÷ï9sbƒ+Å/îc'šçqè/œˆ³¡F›3%IÑâ5_ck¼ñb,ùÒ÷Ù³/Ÿ #¯ú*¶(GG>ºÛ×÷Q3Qk9´ŽC÷&)” <øTG¥…¿Z¶=ê໹ =Ö 5³±wýOì‰dsÊEu/Pߌ"š•ÿÄ70pÇÖ¸áȩ̈bzÉíÞ^Û'Üöµ³Û?àDWmÈ"hđҶA¾hþ6YMGAg` bƒ%îÊN °Èg^‚ÝþæDW»­,N‹g¥HÎ9¬&«Ï ê`_~‰4ümÿ×¶(=îëì~UÁÌ6 ùÚ¾³U¹Óþ¼–w“vÇÔîûUXrxsYLßoÏ«R1+¦)bû–„‹¦ ÿ¹“ôr4ÿaÿpY9•1%ñç *€jª­³ÎtIÒÏ¡,N͹Ó)|$Z$…âEû+Ö×쮂kÔ¹öŽÇ£¥Ñ©ÅL±¾¾À T'Ô[ØAq-X5iyiÀj޽À£Î_¥lÖtØŽô¶üϳ)ºíòÉÙKãT ~»bZ>9ÆäWœÑ•=»\|tçÍ•pµ†é‰ý  (¤äZõ#´½9¦Ò›0#½Ãäsf%6™¤/n ÔEo† í jÿç3¹úšû^j©³0ôÖøf¨cîÎN¬Ðp÷='¹aC¡å¾|¢eª¾¸<‹Ajñ`Øìó Ø™Òi-ï,¾fb Ìdj,6›Î‚š  :µ4 uHaè)…~_Æ®x¤è;îìéøSÙ…„Ö‰–ë…—<››iØô­ŽÂ1¥¢;3@gÈ;Wÿð¬ -˜eÑ=Ú`+Š`}''‘´U Æ£§ŒYùŒ.âmÁê•€þ‘mHŒÜÏ5U²…¦"È/Q¶•EXjÎ}¼â-X¶»x!W–vAKóu-;?Þȉì½èõÞ+½Î|ž@^ © o·¶‘¢Ïî!C^Ž15zd+ïÏK¤ŠHãõ ¨¦°ôD“2€ÚC>Ï| ´²ãFqªv2ÿƒÏãï(Èòz“¸<©ä„9¾§y+5m‚xu§O×—Õ¼¿GN—Ž%'3µ“`¬ãFÝ´¨aŸNâPUÇLdɉÊÔú·Ï¸¿‡Ye+P¿6—\bùJ«xVH‡oÁ-äÉIzí¨á®;ýÙó4”Z“ y'3óm¨<ßþtçÄ} õ pÍ z, ]ÊÏ »aÉ7>h!’¾÷E+„)½7g‡m×ïÀSh|¥t5c¡%œÉmÿxàÌoãoKooÌ-¯½³Ž‰ôžlVO±}åŒùszzþ¬Dv´`z‰\'‡ú ƒÓ‡;k›ÌçgN½$(á‘\0ôC^1i¨÷ÔAÇÓ ža;&§UGíæÑk0Ë7K[ô­V¯×j-ú–‹¥å…Áz³QŽË~Ÿ/º…$Š­€\Ö'¨ŽÇ¥0y5ºKû!’ÔÆ\Šþ¬£è¤{&O´o‚vÛÅGt“PNpаèM1ýþà 7{þtÂÅSfmú?[& Vû¡^/B¯ ?œ­aR8{²4« 3£*´ Æ`´-G²±êªŠR8KUåצi·…Ê£˜ð_jü`%`ç+~×Bzv Ÿª¹¬®rvÍ›3Cœ† ߌ©z¶ý9¨£y¹9ùõ9,r{¹/<Öª±^æk̇l*·<£©ågëa¸Ï[Ô[Ž™0£ÍÕ%&’›g›ÏÌs‰Ð¸Î×ùm•u¦b“ÉTb²”¹ºv6 Âx,>S\麀 þ …Ö‚endstream endobj 202 0 obj << /Filter /FlateDecode /Length 3276 >> stream xœµZKǾïI:ðØÔ´—ã~?„(€ ØÉA”5‚`é#.—˘äÐä¬v7¿7?$Uý˜ée;@¤ƒ†=ý¨®ÇW_Õèç ­Ø„âßøïb{A'«‹Ÿ/˜ÄÛÉ7×_PF*G›\ß]„%lµ¬¨T£L儚\o/nÈûúЮwÓ™5yÿŸÅ”ëÊI'Éý”VT è#›%üp\+&ÈaúãõŸá!òc8n«u}{AÌôú_8EåSfR²ÉL¨Êj³nH}üþa»<¬§3<Ê ª,YÌÉ|ú:ŒXfµ;ÍòJ2ÃÃi7ä/w^Vi¹s¤]æÛÁ帕p#F² —Ù ä6{s œ¨œc¤˜S­*ÿ ´È4iÜWU”jr(æµá夵äŽ2.åT»ìÀúØÆI ô9IÚ5…µ¨„”Q»¢v •°®tJf`VnQN!A>©—¯Þ̧ñp«I}X·¹Õ·åÅÖ ÿSs­¹!2ìrlÒà:ñš ž7ñì¸&žïÝ®?ygsÖªF̸╥z2c¢Rx/¼8¨Ðß\~Å`¦Ô,*çÐ<ìnßïïèGcŠÒºbÒ&=­½¸Ä1N^À6™Oår߆Y.a…ó‘ûP“»ÚÇ2ŽÂR}6^ºÐ"ÿ±>®›p<“†;òÒY®F1 ü¬q…¹åžù}Vñ>`…c[—7ͬuÈ~¹(Wìü[\48¨Ýå‚n§p0ÅÍÐ=”•e$޽Ä!âx³í_¼Øæ*¦½ô!˜ç*FEô0k ¡x‚‹`ÿ(”°#Bœ9«é œ·äïS(X3$Õ(ÅÐ^鎟ֹ’»ù€b÷ÙñiÜÀ‘ÍÛä=™áác@V­ÒAòâløàÍl?’ ¯ò:Hé@àUa°]yÅÌ)áÆò¼,W >yDè ?kÈ•ƒšYP¾4…q1ÅD8ób±Òuš”ûJ θ@X V—[¡·‡Cý|y†´P.éñXxÓS²@ƒ ¡­YénïBÎJEq.¦<ÇöÛ˜ÖÕ@ioe hZ¯Â8f¡˜;¤ƒä±: D„íŽî Òo¥ÙÈè?œêÒ3Qëémá >ªƒ`¦ˆ¢záU qýT¯ò<á‰ðäl%•Lê^åð0Êgh¥i2x¹· b‡±¢½Õäí0EÐÎ…?üq:S\úKï›Ç÷Ëö¾¹=γȚö^ÔoÇ l ôîâúËòÝÃn z7C §õýМìëE¸¼â Sx±¸?cHÈîHžÞ\¾ýþ—ÓWþñãzõsöüïôŒ‹Ï~¥ieæÇñ4éÝ.ˆ„o82D†AFuÌÁ™îaJ»¼Mz£v7SIºN/¥%fýÆ®âŽó2`‚+¦Fj˜ä=œ0:P8ÿŠ‘u{Œ~ŠRÃ|’Ô1ü„Q$Fœ#Ÿ|pP>Ü=I_`ƒ`•²Žuv:íIcsØÖm[0ßÝêuösLFU†uÐû]È2ai&óº,DzÚgId“ød7  ‹ÀO‹ä„Á@(´„2êy4E_ CX˜¬‹=6MÛ9†¢ÔçÆý ÌÇs÷AÕÒ€rJãÁjJ2MAùÂß÷¤RŸ$׈ï'ÉUQ¸ŽÒX:rºÄdbTŒ 8ðËY‡à¿9çx")'’—3]ÎT¦Â=~5Ý"¯Ž£Ü´jÓ”;ï”ç¿¢•Ô}͕˘Ûq—/rgìð>¤'$Òy².zå¾€€f蘅JŸ [—Œ½™k¹4íz¯’Ë<ûIÿÅÁ³ ÅtÊñš UÈÓUηëàΠc‡¼SðcîAëì *ÊëòàAà: ¯‚|Ü<ò?½}މGØ®‰/r&¼i»¤ïëŸ1e8V1•œ*\9ú^‘’E§®ãzµ[±˜*O†uã®ÕÔ„ºÛù¦àoþ”«¸ªÌÓ̲Êhó™<½ø¸ÞÝBé9ÖûýæyNØk“¬j¹‹IyNn±lî†cجÃ\ÜÁÆk¿‰ajOýà·x«Y¢ µ›+ö#êlÖ½Kye¿aW?&§ä´@Ùå0écº¹á§e˜é_‹‘×"{/GÞs—åº£ÔØ\«ÇåÒ£“•ÉÎ6g¦Ä›žD’Ö¨ëAýÔ³ƒÒ¹¯F=ø¼Ö}“ úp´¸!o’`œ|ÿûw£ò‹üWä}ŒTðï:.™ô5âHhü¹Ë[69¼mö£(ñ¢äéËx6 ÇéÙ8NήÝìã R“f…¯€€¹ÉÃqyô¿Èr×<¬îñÙ†¦Ptœ‰Þ‚ #ÿŽ¢2"#ÈržÞ,KÀ¾8=e™6CøÙLg›Z‘ ŽÃ3(W£:¶ÑÒÓÂ÷PHŸ%iîÚå.í,H³K;ƒ?#ó—±’´¹ù›^–þ.Öï°mâ¹Æa? ý«Þ¥Í4ynB³%ꮤ9yX6Ñ`}éB’YBÞ÷‰Aàõ8êQÅ™á*Åû¼RAœ*ŸùÈŸBÄxcŸ¼ß:ÆÔ¡¥žùxÙ dõi}S°ó?aÛÏ6¶ ŽÎ7¶üY¨SLAÀÏÉy]Ù†taML³Œ—…¸…¡aŠŸ=Gë 2Â)ü£wœä9lÐ÷³ƒ—£@ÌÆÐœ›THùú|{çqŽìù\Ž]fšýl3ÔëUyØõP×Y£ª†,fQo¢ó[½O…‹-rß›@{á°¥­¤w:Ÿú_Á‘ŸÀ/,¥ƒ{¢¤ ë&IßöM|BA#焦ùÀf ȃÚ:íG…¯ß˜`ÊÅ KƒÀO ûCɰ(5ò‰îPìUmüaÞ½nG3š†»3U0ýÈOÇ龑Ø/1edŸR ¯Qݱ¡3ÛB$+àý9Š¢YW”…è:ÿAVGÅÜCÍzþD(2¬ê©ù¼ì~Ú<”±ËA1ë ’ñ‹"·Í줒†Öëb‡—°…vñ›»Ï_•Aák¥ŽW}Õie¸í©†wa°,çeÎe tlaxH 1…evY²z4¨}ÜEaîN©÷t,G3ÈP,AÔ à^—/îŠä1åÊmV yKÑìóõ¢•vPÝž£€Eð¯·5Æö¤…ì»~kÍgûÚ4AÝt†<ÄAm™Û·iÃ8¦Í:­u)Zý EÚú'ÿù˪A»‹ `‹Bf »¬Å1åH bÙ†šôòh:+šµÙ~Ó§ª €ë_òlQ,Ìç<ÛVZ ÆûØ=_‡c¥‘: ÙÅ÷Çc´.¨æÜ—.üº(Ö·PïšJ ÙKÜ@rùhó&vÁ­ŒrŦ6fÌA*Qr´MD±¿( c@J¬¥¨ƒFr¾üJ-:ß@K[ *Qn´•R‚ÓZARRP[hʳ-Â糾ɖ¶À/ÔQ¡˜c‚;M—ð„ß.¿‚ñl‹ð•í´‡_”$‡•†+gL.9#4HÁ8žcmÐòûb:»Å} Ž<¨ Æ[•^–„&)D¿ÑÙg9&Я㪿õi˜Ø> stream xœ¥½ß¯ž¹‘&–k]m.äB˜¹ù´Ž_²øsœ`wÖ»À`&˜íU²‹¸'€Üݶå‘Zµìç¯O=?xtN÷éYg†Ñç{ô’/É*V‹|øþóóë®<¿ð?ÿ÷«wÏ®ç¿yöÏÏ ÑçþÏWïžÿ»WÏ~öED"wûÚåù«_?S‘ò|•ç³Ï»ýù«wÏnåzñêwùp_îë®ÖÈç_}ýì—·ûáW/®»«Ç,×¾½ùøáõ‡7oÿôâeD½Û«Ýþ틚®·¯^¼Äƒ«¬±ÿøÃƒ>¼þø J·DúíoÞ¿ûýƒÔƒ}·µn_|óþ[¿hÄíû7ûéŸÿñÕßfÃÇõ¨—»Þ­¶ÔòÛOõmÞ]­íz:÷W/^¶ˆy{õÛøæAÓýšú¨Žz7Ç:U|ñ¨¿~ØÓ*ý¸Ñï®ÙOéxQ×Ý•Ïß^ÅìõöO¯£&Œ:F®¤<ß9 u Ž—1z>ºŸ¿ÌÚÖnÉ_¿xÙk»Û»Þ¾úÇ?~óåío>{ñ²\ýº]Ÿ}úÇþàïo?¯×U¾|ñs<×òûöúWoß|›…ûùõÙ?WÁlt¹½ýø§ÏãËìÖ/^=ûOP¾Ô”»ºŸ÷Q²%åyÝWÜ]ÙáØ%;ðüÃ7ÏÿËóoŸõ»Ú¯„¿OMüÛüÿïRwÿã³Ñ––…ǼK…}$îÚLdÍçoñ³Ý-üÜë.KdÜÕç}^ãnø‘y×#‘w¥Y9(@š¤å¬ÉFΚ¢Pî:q×»Ô2T\s ô¦Ö²Õ‰@ÿ\M¿Ka&Ò撚q—bMdÝ…^ÞøWŸùÊT"ûn4 õ”ê©HöNÏôz‡>duSÕô¸DzG$e$ W?3îýì徚y7Э§ç}ß]èVo©´DÆuèV–.FÊÝ$2ïšJ 1‘…!Ò¥/½=Up¢[Yº¨…)Å ÝÙµg,Jsf}¡û£:½j²x"©w Ý)U3#—H6P¯š]ŠԜɧÙçåsÞ-tk怹Ծ+x{¾óÒ»Öu׋­zV‘D1ËÕõ•ƒ‰Žf+ºÚ¼Ú]G·fƒˆä|ÐÏX¬‰—q™%f;]óÀ#º»k QTÐ0ÁªOáœ=ðr«ÀÕhöTó¶„xØS©z•Á…œn†1 Y€H•{ªZ›BVR%P¨*¤ÝU²Ú²!²x=ŶثnAôî²…„_¾%ÐD°#²¬B¶^ž¯ìÖ°qèÙ°¾„èUùÒ]Ì%dHžeÚZôük4!š= çžB$šžv2È‚ôZèä"/½*ÍäeD3g !²)ˆ.{µ!E"“Q pÍ‹^ÈpÍÛòÜVO;‰¨eÕ!õ4”ˆZ€XX_"j"Ú)°ZD†šHÕ(gŒ¹t ršJD-@d¶{£÷H¤Ê4õ 1áåhõ´”ň¥— ‚ ²V=m'‚–\OA9‰L-@ä¼;bÂ"dú][MD~¯§¥¬ì'@eÌ@‘tOÛ¹Xœ‰ˆåÙ‡äYû‘'VCˆœe.ǵ™œÁÐ7‘)á,$"›×QäÐ3$KÈt©Á°eU5‹viÚæ*>ˆÅ›fò2bñ¦t!ÅŽÀŽ}ZGºi&¯!ij3Ídl!ž¶M#Û¥c–•zXÕoÄd]HS)„`Kˆ gþ)/‡e†Je4EiÂï«ßi8³±Ä)M!Ã¥&bxNº¹8áxß—Ä™ˆgpÆ*ˆY€hmÒ±bÞB–K5Æ,+ªZϘ‚n.NXß2ñ¤F8°„xR§cìVX FZÎÝ„H \ò"%é\‡‘éR]?·‹ F- ‹LF-@š‹,9¹Däü‹™è‘~a²›Ý&z¤•Ô»ºåH3KHw©.'‡`2%Ï´—K-E-X¨ºÔVÔ»¢RµÜ¹ ÁH@'—ˆÔbäT–<§ ÁÈ Æ°%‘p©¡°Kà)d*lID–}¤¢ÑË%¢Ðf¤ÎHžëN3k@úKˆlÈPØ’Èp©¦°%]N.¶eä+ª)Ê@qÒ“[QKþWz2ZQÔ’öÓz’!&\;ë¶‘†sQô=ÒL2jÁ*[£“!&£–D–F§ME-í¬öFšIz9¼SýÌs‘i'µÀ| - lj Z²Åe†œ\"j^ŸgCÝÄJz‘ÃXI³Sq4'­$c–GsF•KÄš“V²±ê`ἄȇŒ´› ZÒ»\jqJ-Hi¨ÉcËÇÁH˹ È©Œ4”U€LÌÀ˜½:«Ü‘–“1 Ä¡Ï!׺×#ÌnDqó˜K1K"ò3#í$c–bQ‹3ÀdÌ‚•ƒZ¼ª|\óz¬fiŽ£K«+fióèÒŠYÚ<º„Å¢«RƗÈU ©+#JØŒ4“ŒY<;2¸dÀ’ŽØF(m$–Dl„ÒFÒÁµuŒPF—ÓˆHìävè1ÓF2`IDÎiftÉ€¥ÿD†m Q ?¯fanXs"KwN`^SñJad)^Á"ËïÞrq‰HµfÉbDª5+£Ÿ½XµvcÀÒ‹Uk¦‘dÀ’ˆ*.C«7½£éÖ,[ñJN?éÖÌK¯6S3­æ 9Ìòpýä,fmf"ºâ•~²ƒáÃ"+5ër¡°™b° Ñzb¦‰ #ZÇ!-Èx%­¢Ö‰œv¢j¢+bé'=2cÈ¿Á„èå±$ÍD¶KmF,ýdPJdÄ‚øLïnUK"2[3g?=\".Ô,Íî6’‹Òa—71 ºk[[.5޶A…ŠkäjÄÚÖ«,¬4Å+ È’ÍlF`mCébmëËÒ< ž™¡%ã•ük[MÆ+ý¤v‘ld¼‚%¼Æ/CKú·D,!Û¸,½=M¤”`{%ŠÜ"㕾ºåR'uÄLâ¢ø yC)Ávü4))Øv½)B#Š ‘d¼2.[6¤éÞ7 X&zë7o…+é"dÙËc¸‚´„J­ªp%-š¨£wÅ+\$ኙ6¤Ü¨îКŠU3óDœ—AVW=Ø—¼òzuZL*ü•^&’ÁÊ8©/d¯øž8Ú—6“± –»=åÜ A½<ãÊndúå[± R-ìR=ŒUàT…*ãdгQ¡æ<³/SˆÔ‰W#õC’„ÁJzX©R*Õ­~ÈSлÁ ‡ªŸÒ=dˆtK~)À°îqñ¾„¨uÅI™¤zX-K”ê‡,•1¬zXŒ†«‘_]ÜïH`Ú­bi§B'ÅÇ…\Qc°þr!­ç°æa¤2¦s)\á°Ð²òa!Bç–ˆ” ˆ!DÆQ<#•DdüW!2~€©d|"ýCàªRÛÖ!è2"ëÇPQ€ÞÝŠ5àdw¡5X ªM)Ìiu!ËÒ\ÍÌ“€¤ÇïBÆÁçªTqoIç6‹¼Å9‹­K¢=Úÿ%D¯Âî~WgØh)›-i½ŒhE@£2„hEÀ™.@ L†*óä:9OX(ì{¡¬”f"Šë {êÀ ÇuK[/D¦_¾ïK©bí³$p¤x)… ³¨>äÃä{öPšùÞ•ö‘¡Ê<9Ô5•ÉG/¿iK˜]žwa_ǀ¼•öR Ðæ­´ŽÅµhŰ–Ó1îÏêäp˜·°«Ó…(Ì[N2J™' »Ö¾/%[¸°¯B´‚X»Z”ÓKˆ…}!DíŶŽ~wÎÅÌiS¸ö¼/£œÄÚÛ’äG"ûºªÎ³A¹±­S…ÈbË–±Í<éÝ}9ƒH½ å¶-Ü×´ü·máVz˜¸Ëu_HßFÊv Y~¦R”뤄7’¦!DŽx—.ù'¢ÀogcÖÙdÝÅÙ˜uÙnìê9yãm.D¾x#Y·„ÈîêlL"jNu2ú£>(‰•Hµ/ÞuJ Vµ9Üi2§À'«qÝ—’/ÞRÒ·­³/¼yÒˆzMA U=À¦N"_¼Ã©˜öÅ;œŠó÷«·¤™ˆ¬áÆ’˜½< ê}&DÎx7§bV³nÆ «Ùn-͈Èo,˜ØÇ~ç÷l)ëd°ww&&™Â­UyâÝòìöÄ»:¬gíCœ»„Xûº31hÔƒîLL"rÆaš«Â'örýCT#@#3œˆY'¾‡1‰Xûư(çÑ>ìé°ŸëhüW"g¼§1kí›NÄ`³X@X˜'Y¾aYÍ>Ú7»òjÔ\ʉ˜uÒç{*“€•o]úiÍÃ!rÄ{UE)û:Ê·œ…Ù×Q¾å,L"V¾5§î“^߀.ÄʇV¡Oi­|ÛY˜]Žòmgaöɸolè‘ùÛØÐ™B¬ØÑàüÞNÃ`ùnÄi˜]eüê…ý#4~8£¬Ú®2~‰T…);¤~‰8 ³}Ð"§aé†d¹¥OdI¶³ô‰lÅ)»IûêUœ†ÙMÖ/¥a¶óö e¹·O )LIÄÀPNmwùÝDœ„ÙNä'â$Ìv"¿^ØÍ12ôjlçt!Kï®UQJŽô¥wUgaïà$LMÇÝ#C/¯K9µ=äzÙ SöÔ¢·^á$Ìv¶?'a¶³ý‰„¥9ï\¨+JÁ~µÞC9µ½÷%â4Ìvþ?§a¶óÿõj—…¹dì)Ê©í%eK$§¤ÏÕ7ga¶7Qf{? )Yn™º–RjXÕøÕ›q ·u­+ ĺ֕…¢z;5Š€u­SÐD–Ÿ̨í«]ëʱ®uea€XÙwˆXÛ°—3…D*ˆ+¬lCI !=ÊÂéÒ’Á$6+Û`ª™ˆ•m2%Üy¤L¯šÊÂ0b $ €®—O&=‰L½1`²]j0§†0§HR:rC$4\“Y]£…ÈBÀTƒSUD¶Þ²±SÞTHDY ¡w/f_ˆt½¦Þ½˜§ ²õrXa¾}(°KDY ¡áÚÊÂé.#~¤3PAìv©ÉØÊPÕbì ÒÔâ­, ºÑZ°“cDÊUt¸‚‰C…U€’0èGáa"ÃÏL‹sÉ&‰lùÑZtV€ˆLYÑ®?™²"¹l«VÁ¶»iVÁ>)—5«ú"zqQ€4«å`€H³J-’%6áU û8è$2§j.6i—iV©ÊÁ‘j•JSIDºUê”,‹7Ù T/5û8ô&íájq( Ã[-Ž&Yo:$Ò¨©®‡º@Df«„²0@d·J( Dv«hO¥#|—Ý*Úü "»U°Ó„¨â¦, Ù­Âì>¹ÈÒX©wòçf $Ô\¥«‰tÕŠ¬ò2Õ\åz‰l5W ØŽ•DQs±‰Ó…„š›ö1–+RWˆ5I™¾DæÑ¤Q,ÌiMRRŒ€5‰™*V$eˆX‘2¢œìÕ:Ф\ +’òD¬HJK±"¥,]ˆi* ƒõ‘Iëj"z•¼† qJd¹Ðb ‚E•:µ˜ƒÁï0P(Êz9Ô*‹Çjˆ(Ô*i«ŸQ¨U–’0»m{&2äÛÝR//éêåâ©"6H7ѧê޵($"oW¶’0@äí ¶qŒÈÛ„5SˆÄëDy»‚Mœ"oW/%a€ EÂÄžnB—Ö±º¼\ˆÛ×D¸S•ˆ’0@HU˜í%DT½–„Y½{wVéVœ*[DDŠSa2¦)N-ÌÂÞ¤ªKšÝjS±‰Ãnz¯ ‘©H¥z¯ ‘­H¥z¯ V Ÿˆô¦Öbqj¯ òy.Ô©ÔiGV«21@üÈ”g«ËެÖea.{²Z·•DÔmìáè·ŒMÅŽY›JÃìºmp*öpŒÈàTìál!Ã¥–•ê]€D¶•ðF@öé’k o$R%MØq•j¡HÉT—jŠTÂ'QQ"Ùƒ"9`G€ÕŒ¬%ØÃ ! ·kšHF*Qo×^©D=ZÒ›¼[Ô£%ØÄ1b5éC‘ É B–"•ˆ£'ØÅ)B¬'Ø×hB¬'ØÅ1¢ˆ§b€ýlŽx*vqXO†1@¬'UÒ½…sø‰, 4œÃO͹ª„sø‰…*ÑmO*r£]Èt©&÷ÝNE"‘Ȱ=©s*VÁšÃ¥–b© ‘­X%œ£O½egèóg•4 O «$2\¢+VÁ©4R*¹ŸË¥¦ü[8ŸÈ¶8—r9?.+âK) VbµØ¡`%œ}O¤É¿Å>jå¡«6r¦«6rh×ÑŠ½­4gÛk\E®]Žƒãªg»¬q…¢•V¬quE+͹õD”Œ2\jÊÁáG²%ÎVífN‹¹™(EÑJó1áDBá 6\ªÑÇ5gÎðÏp‰©p¥…mE¤#~f¹ÈV¸Òœ%O³Täàš³ä‰T‰³9MžHS¸‰Ku…+­Û§D WšÒâ ,ù·ÖŠvrŒ0”ðR¸¢Pšþ²üÉÐ !Í%šÜ[sÆ»‚¤SŒl—šŠU°vÅK± Ì—J¥Ó…XZ‘{kó(@«år¸JšNbh]ÁJs>»‚¦Ã`¥­£(`Û[¥#@Ë’tBˆÜH:ÕÏÈ€¥ÃhœMÞ­;U]IÒ12\h*X ˆÈR°‚•¾JKÁŠì4‘"ÿÖ‹}I:Fä@Òa°Ò«c’t4šŠVzuì Ž\÷¡ç ŽåÙ}蹂¤Ãp¥Ç‘ù¬ WQf(ZA*B}˜]þ­·#ò9$ÎÞŽÈçT´ÒÛùÜŠV0’*µ.E+Hi¨ÈÅ PdIŠŽ |5E+}8>C‡ÑJw¸‚¢Ãh¥ëXtE‡î­ûXt%G‡ˆ³Ã•.DVF+}zýAŽNâ)¾»Ü[w6¸’¤cÄS|O…+]¹ßJŽŽ~k‚“¢CÄç¤)ònÝ‰Þ ŠN‘óG‡áJß¶òäè WéÝJŽNÂ}­ ޽["ª¸\’æp·’¢ƒnŽâ…):MHs©¦he{zPtüˆÄK†€jé’ B$^t­Œªð+˜jLu2fœ„, :Uˆ¼: :]ˆÌ7: VÆÉ¿’ S„È„ƒ¡C–šƒΈ^E±Êèž¿dèÐô%A'„È‹ƒ CçF*§!iŸ’®àè0V>%]ÉÑ !²×äè°W'u ŽŽJÔ)8:’æ´Ï&G§Q¦”öj9yŽcìô ØúeQÂÈ °(a›Ø¸“?‡¡Ê8)Ptª ‰® èзÍë³ë´Úž'ãI‚NbavVbaBÑ¥éЕò èJ‚N"kÜ$3"²Æ$è¨ÔÉÏ !Ýoù·YÏÜœ—¤9O®†*Ó¹Jòsª`äçt!žš³Ë½Í“™?‡ÂœíLMìå!jðÔi52½ ç0PÉêdzAÏQ¡“vl‡î̹9D†Öe æ0P™'ÁØÔ²qä¶¶<Û<ÉDsŒXnØÇéB,·4ŽŒRæÉ’˜Ã¦­#7ì.4!–Ûž–ä:rÛKaÊ\–™9¬ç$ÉÌ !˜9*åóÇÌŠrT ©9ÂE*ë$þÈÌa!×±å×–ÏWÐr–M8ÒrŠM8ÒrÐKä‘Umq"f9¥ZNÕïázuJ {qÊß‘•B”w+‡Â_æ«VÐr¦¬“­ëÕ©˜Õÿ’–S…("-g‘;ìu(NÑ„ˆS1ë¤ã@Ë¡c[Ýæ’´#jNè 6 -(l䰜‰˜5ŽœBdç½N¢ ¤Êrù(o+‡aÊ:‰5²rØOu ‰éŒMI ª9³|L·‚“#a.;:rrØÉ“1#'§ ‘£'G¥¶'89¶ócdäšO¤ä4!šR ä0HÙÅSŠœšQ ät#Z•’B”Å %ÝÜUa)9T€]£‘S„(F#G…Nf‹Œœ&D^¬T¢ ”¤'ENNâé3Dt¢œÆ©ûd­HÊÐ\°B<¦1»¹L¹í«Á™:©DVŽœœ"ÄrY:©†ÍaU³ÄsÞÛgS+(9*4`pÆ€¢V2rš-ÁÈa²Oz‰”Z.€‘C¿¶O.‰Œ#ž-»Zö±k9JÙ½jO—ÍÀ—ˆÞ½™†!`Mß<¨6°™­X„œ4ÁDKS„Èý@|ú³‚£RÕ‘ÿ¸˜Ñjœ>ÙYIÉ1âZ–Ëøg#§²S:´YAÈ4=HÈ©B$rØ©îéBNª‰„œ«™~†^„ˆä@BÛ7,r®)Dr#'¶ÉŒ•šÙÉÈ1¢—WžT# ˜„œÉj–¢òqªEàã´.D³|"'é>NYB4ÈÇ)B4HÈi‰”“c!§L!ÃÏ,‰³\ÎÇ‚‘³ÐÀâÓŠ•Œœ"ÿAFN"õ#G¥|±‚‘SÈÓ“‘S…l?Ãa8Á`€$ »BÎ(Bôî^%ÏÒ¬ý$ä4!êfçIAn^‡Š Ötœ!ó¾$ËÒϘ@<;¡gF‘í«¤ã!óÁ,ÌÀù ùè’¦<5.'‰l?³`bÎ`„Ÿa†ˆrVàãLvj]ÇVŽë:"Iräã„«úd&fðp‡Ÿa&†Èð3K¬>)WÉÇ©B”…$§ ™~†™˜#!—Ÿa&†Hó3]Ò¬>âVIÈAGk ³HC#b ƒÝŠ”Æf*fଉ = 9FºŸáÞ$k6¼ »uòääT!ÖìÍ\ ‘íg¶$ZOžœœXB4Ìää!ÛÏ03pÔ%ü ý‘ágº$ZO€¬áGHb ¢°‡¤vˇ»*H9×";RN3²ü o“Hãm&t%)§ é~†É"ÛÏ03pôF‡ÈÊ1¢”¬t4êéDåM DÂÏ`zÝ+§£[qÎO‘–c¤ à"°Œ,)1˜+I9U€ŒH9traÂr%)‡H·žÁ|‘ágxqàhÐåg(Y"Í53CDŠ VåÓŠKZŽé-Y9!Ä#Ú˜Iäœ5-‡n.–Íh9”gœ¤åT!ÑF2ig:f\Ê™)rs͇‚ÈÊ1à!í\UfRò ´œ6… WŒtL÷òíKNN7Ùg«¶¤å Ÿ-Ž–Žª ¥ƒ9¤åT!2¹ åÐÍVb%-Ljڇ„›Ó}|‹¬œ"DïžÌÆP„R\;‡ep™Ï6¢‰O^Ž9jÒrˆ˜][IËBI€—C×ÎJ¼œaÄ:¹Š¢–&žl%-‡}ÚG%W(hiç€ oËA§úY„’–cÄ*¹ÈÇ âY¾¶‚–C½«dæ°4w‘ŸëõŒß‰³{ ^c–~‰€˜Ã˜¥Ÿ#!$æT!¿½äæz³{"1Lj¼¥e Ñ$"3‡½êšÓ$æ4Ã…º¼\?G5@Ì¡8û9˜AbŽYIòrØ)Ó<+y9Cˆ\>n¡—;?C²ìflVòrªùòrØ¥íæ–©x¥oÏ^ðrèáã«’—cD’#/§ Q| Х 1>-ªð8k:°rè߯9¾@ZŽ‘æJ–"–ᣠ`å0`ç$Y9Uˆf*X9toìÅJVŽ‘îRMË8Ë3²rاf“•Ó„hVÝ›IL¤œbÀƒZ€yƪUÅ+ã,½ÀÊa¼2ÎÞ&h9ônÔ¿J¯‘銗â•q¶íIËéB41Ib]B¬X½Ê»Íë(h9F¬Y؆@?çYG‘,9… ×<¯Ì³—ž!½Û<‹&òrŒÈ5€—ÃxezD¦Ü yH^z5›ç!ie]ˆÂDòrˆœým2°–5olE+óĺäå°S¦—U2ˆ¦ågBâœÓq7‰9 ÃN]grS†nd˻٬Kœg›¼Š*ijn…B•uBV0 ª¬³3Lj³ÎŽÏëñ«±ƒ^® ât;Cp0 ­¢ß™]åÚVœ‘Ù!Y®ò 5:¹ÎŠǘª¬v¦6sXs·Cä©à.DjCj‘a½á‘Ú%DzîEˆR»¤æ°W" U– M så™9T 6sØ©³ýÉã‰Cˆæ¢SJZi’å¾l¬ÉÌA7÷Y9™Ó…t#K‘Ê>Û”»‰$ç‘=æñ‘%d»ÔP¬²—h$ç4!ŒpZfŸ`§Œx0z=EçÊðvH"‹¦¬L¹?ËÍû-ăѸ<¬k„$"Š+ÉÏé@N$‡íeD+<Ð+‰vîº œèµftÞIÄšÑyP"‡‚À=Ô)dÁ¾Ò(׉ñE9Cˆ\ÑÖå’‰¨OƒWCâ§&0¶òæàù1xö:‘s˜[e­ Ñú››^Dήv£Êb¹Lžû8n,KErN²=\)g [0ÝÈ6‚¬w'zææH‘‡Ãb•Râ¨ÀTRˆU`I³´£‹wC‘a"Aݺ?‹”;â ò)H¨vëìê cÄíYLOœ‰ö»6/‡$âöl¾zmr¸‰¸1»I–儽HÁ^Cˆ_¤‹G©'%ÎäiÂRšppåÿ òsŒpŒƒ©Ht³VÉ!.]ÉG„F1ÈÏA§ª9Ùƒ‡B™2p”guÌ· Ø ù…‡¸›ª)$ýÙF˜ÉEÙ@"Mò¬¾˜$.ÝÎF¤áùD|ûg ´–.D7›rŽ'):F†º^I[8^ŒÐ@j¶vø a0“B¦ -I4´‡È.Œ!`ª5ÁÛ!Ž™W  ®ˆ"²T GüЫsj/ÈÑ1buqà(º‡=¸ä"bkuœÈ8ãÞ¸?Gd«žV$иS¬G8@ rtBˆ‡T×Ò œhçº>°Þ»¶?²$ÏvɉI:UÈTÏ;Ï+ƒWtK w³óôï(ç„YpdÄÝìܸ8)ïnê6ŒDš\lh5B «SƒHNÓ»›£HœÍ×VZp¾^C3Xœ€Å‰ÍVìüv ¯]ˆgÑXç9l §ÙO=0y1$~Þéß'OÏ Ó¿Œý[é×QÙÙ%Êsþ)ÈÐ05œ“÷B&R=¾“YPßuɽõ8V@‘OÍÅk!Žÿw Ìb¬H?sA$S"~¹¨Ÿ£œ³Cq‰Id©ñ$H~ûæ)"VP„7ÖÑÏÝäÞΉž CLj'¢8rLƒ*AmÞ I伜\çQ†óµQÄû"¢—ÛëкŸáA„Dœ‹"*½t뜇 úÞ)d¹ž%žÓ.AŽGTAŠŽ)$Ü–1•¢Œ"ž‘ågº$:ÖéV™ XΙ“(¢C !Ü-±ÈîV-rqÓáRØS$RN·j(`™÷V»–ésHAƒÀ±QÀzÓÉÍûñ’eàT¸â¸³LÓÄ‚FÝ:g1‚D–§æhrrç¸E¨CÄ^9Š 95/-Óé¨ Q‡mÞžZEGg‰¸æV%Ñsâ!HÔ Z[WIJœV  F,«Þ×:åá–³H @q.Óˆ‚žõ4{¸¢£‹D¬º¹|€RýL“‡[ýè[R‚s\ ÈÔA/×<ã×—"–å;¼"g ~úDIpª„ÙòtˆWZt,l”í›è*ΈeûF¬ QÙºí* šôoÛ7YEÑá'"òTDVG±gUÀr6Òƒ<.Äc3›üÛÙ%êËâNà  €qú0—–=OÖ¥€eÏÓ‡UäàörV•4÷‰3ÈÔ©B܇E¾ÕÛų~1‚ »xÚ/2ž‰x~hp1Í Š.Ù¤Ä!C‡ÈP¯v¸”nÖŠ¢“ ¸7rñóŒÕæµR‰Œ£GUðS³›$ D{·6ª„o¶·ˆÈ6Â(f€d£ùUµÍ<êÙt ’tšékÕEÊ£ž Õ@yH²êPÂÃkD¶^ 9êÙ ü¥RN<X:ppõì|i:Le²tÐϳ¯dé !~UåiåQÏžeTÝk›Èý`Ô(‹PGÕÞÛ¨gû1@Ó¡œÍÆ OG€‡½*)ƒ 5°n‰²úªŒO‡ò¯a;¢‚ Â…š'x:pohƒº Ë5 ¨ßÁ5b:ïU÷T5@#Ù™À2R\Æ×8:fÝgd¸Y1ÜCΓDզ É3#ƒŽ]zD©"ÓH‘„/þ rtÐÇðÂ;ª.Ÿ#²Œí<0ñ>$ÊA?ÈÐaó4”}Kø1=¶+ðû8ݪ»ÀÆKC«û¹,—!áf`­wLz¶š‚Ü#Ö…¡TL=ûHAn:ØB;ÈQuAÒÀ #œ!D¬¾³¹T?ê;©þ’PŸuõ΀ .i¨9¦-៭œ¨‹Z›È>ómUr– HÎI ›wäæà‘^´­äæ –nân€›ƒ°ˆGB—y$b‚m›ƒ^žÝ”¨ºøb@Àþæü ¢Šws¡q&×f ›È<“kO ³¯3 ÊNñ€"óà8BRsPÍðB=@Ía¡ažfšc„Ç=ÔĩПadHÆñ{! ù€ÉsƒšŸVÏîC€šCiÝm¡ì >c×Cfè Ì2C0D$r²sl/¶HÎ2}Ô*HÎA¯æñi ç B¢…È9ÈÄ@35ßC´ÎD”Ü÷r@U‹ú Ž$‘íg”ˆòJ™BœÃQçYô’œÃÎÓ@1øF=IøA'¶70šKíÓÀrmÈÇ ˜’ç*gƒWAè¼°ñ+D<€"] LK¸)S×1ÌàçPž'!öQ"þÉ5~::9!*'Š_ÍZ€¸Nc@Ëpò°då —aB}–ƒ>EœÆèpØàçÞÔઠ™wÒrˆô36•_æ°RZ€–ƒ …ûÚB”™RûB ˜® Òr€´cÍAËA˜»%µ!/€÷nƒ´œ¢%h9plÑ|ãh4ç0m~„ɇË&ÓMV+öÒ +jÓ¡$X9È¿ÀÜiFµÖ$Ͷ½:"+Ýìg}AVzÕMMDù˜@Mp0sбoJ³‡¶¦‚Ä>rV$æ SÝLÐ1q ¬¤Ó•~¡•t©%qöuÓ¹Bøò˜BAsPƒÝÔ„&1½ºÏW5P°›áR]òaëbj0¥ ¤Šô3:ÈpXb‰*$Ç=`^•Q3JŒczÉÌA·Æ êÉÌA·¦Ë˜9pl0ÁZ-€™CÎj½˜<œ;h‚…È¿&r -˜9T`”´µÅì lòPkÀ®0mõÉÍ!²Ît]L2XiËa)ÿÂOœ©ÞÍÛGè,'‘*y®ztrófÁËç¶ô*0ÜÊñ’žƒ^-²-šœZ"ãX lä9–ô*qŸ‚!=À¶tmCŽØ'vÝÛöí9vå¹u~)ÀÎAœûlìtyŸDŽÙìÚè°ø~w¹äÞö8//UâÜ'T&AýÜ>"]ÞdÀèå…GÌF»N` †NPN¿±`pö¦ÈÏ ¦Uù9ˆï ®}«Ÿ A?þ äM% ÉÏ!r¶;ºLþ€—ÈÁÏA¨71üŒ0àsêåÁ»Wü†Ôü"úZb€žƒÐ¤ßO¯)6äæ GÅ×%¸9ðn$wj‚7m'âƒ=n"•VNz…ôô¨øÚ€ =¯ª¾]7@Ï{£gñ3|ë€g)~†WAx–âghb>ÀÎA¤WcÅ‚=0-Z°sðûìtœƒ^Vomtm xnçÁÁ/¶ièºÒ/ð<ÓÏl 2|Ž!ÈÎÁ«âÄ“`ç V3Òâ€ì4/Ž;Þ ÎHΖì"'5vbx#ÙPÒs8\ì2pÞÉÝœü Ç wRûf•0›oL„WA°Hµr';½j¾Ñ/ºÌ×hmaN%`ð¥7 sn ³ûkƒ~ö“7 =½êõÌÔÅ/r ø0O—Å \˜ $é9N¬×e‡NY€ƒ`>M Ðs¬ÀƒyD7Wñ£“&=‡È½AڤРú4Õ¼¹7<àÓºkæIÅD|ÏU€Ÿï/ç ²·ä9Î1ø9ˆVÚ8KuòsøëAzº5O˜z¼[›¾)@Ï¡@§/5 ðs®Àïi.’ ƒš5Zdç OÓ̪=®Ÿ‹+Bª¤9€‘ƒNêL,¦cG[>N—Ù4‰¨‡…I8¼b`S«·hâ¸@½¥r÷tÐê-•_ãpîMå ‰ø!)îëô¦ò†‰DŠÍ6h9ˆQà=l¡ <¢<5h9ðiðˆ HË!2Ž„‚W zÄ‚üã€C”•&+]²N/e`à"·_γ?Q*X9ˆQú嫃¬œ äìe’•Ó8å R||¤t¤œNÄ·ÐI9ÈvJVNö >RÓ ¬Ä(½øªÕDpû》”&+ÀÙ÷šŒ‰tÇ£ó:ÃыՈ9•ÕøvÎ1N­SȃÄ õ²hê xM f;ø±9ñà±äA¯)E<3à55MÉË!r¶ØÀËAˆ‚ÏÏy¸p2€¤å Wák´86Ð\eÏAË¡8Ã$Ý/1JŸtòrЫð­uA^ºãL–ÉDU"÷ó]’g8þ -ýlçhi9hr;i8Ðr£À—ºœLƒ_ŸÓ›p¼@÷b™¤t³‰$àä D#ULRÎb¡ûé¾Ið¤ÃIÉ©‰æÎè:iK„‰øÎ¦ )ê>«€¯?ñÁ™J•ÈÉ!rr\àä F3•-™°ð¤2Œ$ä9Ù+rà×àIeïAÈ¡,‡¯0r¤à[t’.9è¬2Â/q ¸R…| äÀ­áktÒPr(Ê鳨AB:9ÃÁ% 9èÓôW¡„)p¥r ä°ù8L ÒqÐÍeêO€Žƒ0¥/É ðq¦Àµn#< 6àHåvIÈ!r–%$äà]Ë?yŒkÀªŽ Á9³± 6\Üh1’ä> °q¢ôG’XõðÝA2º´ý¹´§ò™åhhj xÑf„·@zQ#<?èE’<øÙ9#ÜIM¤ß×Ì{éÜè©™çÎܨkî<ýŸÈqÌ`ã F'uÍØ¼POÅ`ãˆ3çŸÆ('52b¸Í0Â4ïÍU €ítªˆ£äâ¨×Üà%W®ó2ÂãE®Ó*1xT"' .|½§iðÈÁÌé僗@xOÍo²qˆs0Šdt*Ì qàÛàbÀÏw¢C{Û6“Ž“‚?Ó|žm^ç” é8DNòŽ›œ@ÌgÒqø{"A6NÑ‘ÿà÷³O³\Ö>~óˆ¿c ã L·Ò¬#Õshciš x+p.ufè8%œ“•¤‘¬:àÜÏÎÃkÞÉýìâ7ÏóùÙàÙœDÙ8L§ ’qоzvdAÆA 2ã$¹–fΘ绣ÁqU g ™lÔ÷sað Èï³Ðñ´>¾dã SÍ—¼¿¼„Bç ŽA6ºy¾¢ ã@ Àûô|™¬Äô¦ miÛ{&àâÀ¹Á©h„_¾!bªW€Œƒ@eºÓ“W  z#"6Ïó¡´ž CñÈ8å8{›$ã yç“\A2ê9ßÀ q¦ÌóÝ©G¥ü¥§ 'óm¥ 3뙇›IùDDý’qð»ñoÑš§?’¤âØ÷•ðòÇAË/€ÎjÀðŸZDj†™g-¼FMY'Ì"‡µLÕ¢”¹|­Z‡ƒZ¶ï:‹­µXuy:ÞªŽRûh4¯:G÷Yíráçòèn}Ó|¬Ãõòp߯¸t^m 탷aéÎË“‡S€ˆ)¤á4> á°Ð¹«! ý¬'AúY½ËÏ mѾû#òd᰿ȼ½ Óóbëc½cÅÉ‚… €• À9¼K ùú…ØúŒì€Ù´dšN¥ñ#¯ª¸1¿3ø%1UÜt,ß1u)1ša/#Ó¥NìÀ[)ÑÀ~6ÈÂA û9Wº5õ>稜ïkd©³ØüîäÀWÁ€§ñ‹€zy×á4|ÌãÕ¹ kø›A€yd¥Žuè–<¼j^§ú@߀ñr†Î¦­é&ÄÖ×ì¿•åz¦Kùö¥ØúîÛà¼ÔÏ©Ãiüp’F™ŸHü0‘~‡Ëœ—¥¡Së^''¿%4øñ×Ë£iü6ŒÆfòŒ×ÀgT\FIØ-жè†_Ñ#KÓöu¯êúÈÒÀg,äãIÂé@îÕd‰ÑŒï2œg¦Kóv$á$Pt³h‚ÓÔóÄæAªÁûõÕí*sŽ©óÊ%"ëLúÍOLuEì$á šê“õàà NÅÄæÈ4rp*oý7ppÚ`sÈ98@Biš ‚”}>ÞHÁA'Ïw¹)8hÍùvG¥|Ñ[»ôU‡Ák…PÛçSÊTsœl#‡…œLm—LØØç[» „©»ûS#ýìΔ4RpЫî»Óÿó³ÿô쟟e<û¼“XWŸs%käWwrh?|óü¿<ÿödžyþý³òüoóÿ¿{v=ÿÏ öÓqá)R£ùßw÷¯8^ñã§îf&üÔùß§§òà©ûÛ>G>eFყòੳ{ùé©{äÁS?ìу>>xêzþ›ÈGüÏÿùêÝó÷êÙϾ(9Û²#©dõù«_çàñ™ç…×¢g“p:0UöÕ»g¿¼]/^êC×õV>ýYù'âå[|BÛ'´¿øÇWûì¯Rœ…G[ñÕ ±«ÞÝ#cûûÉÿù©‡pd{}B>EBe*ô§§òè)l ¦>xÊÈ£§Æà†ÿƒ§Œ¼þð'ÿ[¹}÷æ[þ.é^·¯^¼Ä“¦—àÄR»ýñ¬mšw€ŸžøðÝ›÷ߺ‰£Ü2:¹»>óï5×öþÝÃnþáÁßÕùÝé~=]~Ь)·¯~óöýo^xãG…½ûŒ³Z¼Ž>Øè-Ãç—ØRN“2€´$¨öèÑ‚C&Urº}yÓ#?¨×CdX¢gþå©ZpÃnZ„#îÔ‰—<0ZnŸŸ¿j¶À­Mõ…ýbQ~}bRÝáLOãKžl*™Öœ<-nñÃ×\ý+-ƺ¾çzàÇ-þ«ÏÝÌ4§X!gìƒfâûl˜µéå3p@½ÿ·ë}ØHóøwL^õ©ºý‰8|Ëù%޹­.?ùXDù\é*Ié…¥Éÿ§§º+BÛœ§Oo_¼ä=m«ÝÞÿÆ}úðqßá'á—Ÿx;lŽzò½úÓO||j´±Ì€ÿ¼é“…äJó{Z6²Mò™º4öòÓ)£ƒükÎæ-²ÅÒñ¸ú§,j.L`¶Ø@äj0–óÓØýñçOY²—80›‹²œLØmUƒûýC+õæ«ØÒ«³Ý~ûâ%Z¶z{óþÆ%q?²i ‘æíÝûï>ú™õØ:~xÿzd9¾ÅÛR#Æí¾t½ý›ßCƒsœGŠûퟞ²ÿ³Ú–.æöë™(½çÛø#«öðÓ¿¥ñÃy4ûû‡ïxl5¿ñ ǽU¿Š#ÏüF%pÖ¾ÎG¯\Õë·g0ÛÍ=Mù=£²!(>¯BÎEú«¿{öêËÙ~óàZ|ß¼~ûöO°Ç‘|ýS ù_üÃO¶ök›ö·×ß==óp¨`µç/yñXl›è'-J®í3þ§}œEå»§íc+9¬Ï>øgØÇ_Þþ_µyª±ØB®3ž´î¶èý¡EG"#lšçìF3lYYÔ—ð¥WÚqü‘ëæ¡Úÿ«r•˜nÌ#»‰LŸмä•ü~Á?=abqÝVYÇo}^ž4]8sÕžãÊ<úSÃñ°ZŒF¤áÆ­«~z;íYÆ\Ô“F”­y§Kçr ÿÿF 4”’Æ §Æ/Ç¢ÿô„¦`Õ©)p=%ñCE‰§¼56¬CùùS¶åÞIÞÖSuaCˆÖï8vm§sµfü ÂòÀ1ÛË—(?ð&qÅ}èø7¨±ì]æzªFÞ;y\ØúÝSM÷=—G?­íëGÚùªÊ'k|ÔéÛÿþd\…ƒí(ß“º‡Žv?«~žÞ î½þ›-Dò!îÅòß7Š›¦îÚ~úö´Õ”š—HùG ü›DÒü1Ûˆûõ6Ðä?½"z½±‚u•†šŠÿÛÿW?ûÙ7ßÞ}ÿæŸÞüþ›¯ß¼¾{ÿá7?ïŸýÃðî/ÿý}Èüî~~þkixröáøëÎeØÃFÜ¡¾—d@俼ÄNx4Çÿñþã àçxì÷_ô:ã?¹ÈI¿Äë[Ó¯>^-ü†‹¨¯o9³ ò£µ\ðK÷èC·ôæã§…K› I´š¹Ôéýöú훯ýÏu?Š Þø´¾Iïøâ)µ©ü¾É™*ÿò” Á…~>þ+ºZçOêjüHW÷ý´ñÊòõÃN߻ߒ-ÿîýgO¶Ç%>…¤Çõ>r ظ@tøßµ4A”Qä*qÚëÞUþ`³3ñož^[ÁÝ}ò¾·úçÕzoÿ—'º–añµs©@'fZŸÔ³—Ÿüüév¶Þ¯Ó•ñ” Á#qofîôH/ƒL·ì,V.—×O¿¼}ñ×/^â¨ÖÊo~ýåíÝïýáÿú†‹ò/ŽðW¹ýõçŸü ®Òÿÿ\.~Rëö—yþ9”½øT687Î?~ûþ#~(V~ýÇ×oÞ¾þÕÛoγÓôþÙ÷o¿þæÃ§úû@n‚eK¿ýQ­THÚÔ »éºÙ·œ[wßüó^¿ýRMJùìS'þ&Ë~üòö¿óŸ­[©ëËÿOýÙøìÓ{?¾û©ÉŸ’òÍ˸²ŸÖ“þ(sƒðIܸÅý²ü㩨Þ^}ñþâÅS³'Ðs: þþæìÞ p J\Jàö½’+mÜ8&g¨~Áõw²3Y÷õý#Kê6ýÀŽà2ë{;òÅ£D̯¬r><Ý%ü´|~¼cÓKšÐ?¾ùú§Öeß}ä‡3¶õÀÒ~:q†=,$݈w^ðh•“£Æ6ÕÇ«Xø"åù‘9ÇX–zó¸¨Î‡}x©¥eWïî{ÿ«û¥×òc~ë׃geÜ+VÆ|¤GêõLJozÉ!|É{rEðò~á†Áø€UšíýÛ·ïYóÎþ|üê<ù»ÚnéS0nß½ƒ;sîó†nŸæêùŠoéH£·ÑsŒ?qËÄŸ#h^Ö4ïó 9Ÿï£|Û“×°\HÞ=š•ÿƒ&í³róÓmZ¿úÇ?~CÓsouæíeýì“-)‘?JçÇŸnß~^¯+ÍÉÏ?™¸´Œo¾Í*~ûùõÙ?¿NÉr{ûñOŸ‡ßítøÿ¼§Xendstream endobj 204 0 obj << /Filter /FlateDecode /Length 271 >> stream xœ]‘±rƒ0 †wžÂo€mˆ w9-É’¡½^Û Fäb|úöý%’>HÆ’êãùtNójê²Ä/^Í4§±ð}y”ÈæÂ×9UΛqŽëÓ4ÆÛ«úø6äïŸÌ ܸþô®×Wn+ŠËÈ÷¢Ìë5,á5s¥pZuSº YÀœøo™yÉRe@õ ć‰endstream endobj 205 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1267 >> stream xœ“}LSWÆÏímo¯®Cm½v ÚZ2äû{⦸ñ¥XÑ ‚Z(LÐ Xª‚ƒ:'ãTŒnØlQËÄ(:·(sâ%ÑÅĈ“J)_]‘ \ÞÛœ.Ù•lÙÿûyŸó<¿÷=‹EQ3S ¥» fã¶ü7·`Þ—âýD¼I1ïñTHø…2„e4–‰ÏúI2å`¦Y7Ñ—x00+csPHHhRyEµÉXTlVGGFŪ ªÕÿTÔɆJcÑu€pØm(-¯(3ì0¯7–ìªToÌßQù_ãÿ“BÉSLUiÛ …Æ¨è˜Ø÷ÂÂ# @‘…¡d´ ­FZ$G 4qhšÎ£™hšƒ$F¡¨B×)¥£¾¤nPvÑ ÑO¢gt]E×Ówé_ÅKà’';¡Á 5NÊ=FÃZæøÅNïb¨á#Þ£•ñ6§7‘ñlã«lŸÛäÝ}+‡”Š_ºù&ÎÛ4ç¤wt´Ž–*"Ö²ðÍÂ%9ñ¬bøԇ¯›î¤à4s Ç%a ‘“ "‡ I(I¤‘¬#6É8ó!”$W2ÁøðØé‘Ú(‡`*ÁSÆ… NtNâ*uæ>>´º4Jó%ðŠ;r§öòž–¢ö´–DÌM$“DïVƒæô÷ÂÜFUS·5?³™½0”wíÏž´$6ª„WÌ}úbû(¾ösØqøÖ¾VãÈòŽ A+ ŒÐ$$¸5²ÁÇÀ4 ZæUú¢T¼ ç5—·í¹øÙÅúöècîÄÄý‡C˜¾¿&Lå—„È‚¬oå¤á¤€*ÖÉüpætë‰\fQ·´êX­e/fWæ~ò‘*:eõ¯~×J}À4 kòµüÑвA¥b ‚…æeÞ¦AFñÊS&ŽÓ M³pZ]4Xy+絺Ë7}Ö’¯™™coÙd²ÁFÙÛý ÊÅŽ©endstream endobj 206 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 654 >> stream xœ]]HSaÆßã¶Wǯ†ôuv»ØXŠ‚PDŠE2-uRMº˜ætxÜ›³ùÄœ¯á¹rŠzb¸$ %° ,!fì&‹@(èBïÞ#où‘Ð{ñyžþÿßÃu`&ÛRY‰\è‚ÙXÓÔìíî„yN>ÍÈg’ä³*ŒåÁ½$ fU˜U¯îëH}6©É$–, b˜[ͨ Ýïq;›[fs¡Ñ¨Ì¡¡G(5 öÆVÔÕÑêì®{B…©Ò$T¡.Åt ùÈ%44µØE‡€‚µé¶PW[^S+\«¹Qw³ö¼é¨# Pw[œÜFP8 QZ5˜»L5ó•,fÈŽ‘õ˜.LlÔJl«Êg!¶nS\ÐGÛqßé RD É×,Á©0^H¸š ûܸM”pØp%ïò®&$áè‚û0iÇb[O– ÑÒ|šE‹4 þóI* •MX4ü ™Û4Sƒ½û½ñz)…ûõymåË÷S„ÍÛ T{±¤Ø韙6y2ôt`‚¬¼‰~Ä)[›w ËmÕ×­ÚN«ú†°÷¤ÄÓ<7F~B.å \¿_.ó“KþQ?Œiãi¼VmEl*fÓ^M$ÞØÜè8˾˜4:12;2ùaq’Mà/†u;[endstream endobj 207 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 420 >> stream xœcd`ab`ddd÷ vò541U~H3þaú!ËÜ]ñÓñgk7s7ËŠ"B߃¿ð÷``fdÌ/­rÎ/¨,ÊLÏ(QÐHÖT0´´4×Q020°TpÌM-ÊLNÌSðM,ÉHÍM,rr‚ó“3SK*4l2JJ ¬ôõËËËõs‹õò‹Òí4uÊ3K2‚R‹S‹ÊRSÜòóJüsS nÓƒP®¥9©E ŒÎ * LŒŒ,{~tðýL«ØýSdã†u_×ýÐ]ÇüSõ§±èœîÙU]5Ý•rù%Ý-ÝݳʧD,Lè®îæømýÛWé÷”ß“¿{*|wçº <<@ÌËÀõ‰¥¤endstream endobj 208 0 obj << /Filter /FlateDecode /Length 18039 >> stream xœ­½]¯e7r%Ø|š~l``\è¥oÊ[›_Arj ð0ܸJ ]òƒ,e¹dèÕR¹ìù½ýC:ÖÏ=WÊ”íšA¡ {VîÍM2È`+ø»‡ë©<\øŸÿûÅ7¯®‡¿{õ»W…èƒÿóÅ7ÿíÓW¿øåX‰<ík—‡OóJ¯”‡ýéêãaŽù´Ûxøô›W¿~üûá«o_¿i­&ÿý}ñºÆÓî»?þöõõt6˵¿~›?vQÚã»×óé_ägZ»ÿLE±cä§>ýòÕc)¯?ýûWöé«¿B-kmOu?ŒU×Sëu_íéÊJ¶]ž®xx÷ö᯾}5žê¸þCVù/òÿŸüóW¥µëi•|yî§ß©O¥'²ÊSÙ_iO}©OÃHZDZÖ[H‘ÈÊ–é>‘È~êF >1Ö¾žæRñ‰D²ZFz¶H{FþJ¤?eÉn&OÍÈÂ_‰Ì§id?º÷S2²Ç³Yûºž†‘úÔ”SðhO|"û¼ Oé(H~3€D !ó)6ùÔì§«É>×S’RwÉQžæRNƒ’M¤ç°ëH?5Žñ4;qª“Ýež¾ˆEî²N/GŠ?zNž)}4«–Óɳ>u4+‡›Å7ºk?⛃Ýu<-#ñ4Ь:ÏÀ˜ÿ–H~ÜȦ@w»Îˆ[º[9#nQ‰4 j"A"Hþ…fµlº‘!æ`TŸ®Iyb(Në)€äP¬FöÓF«r(N½” l÷ü¢:0#šC1Ô;9ô(ÐxE-ß9ЪžÂW;s0ZÕ)|"9Ъx]íÌÁHŽ‚Z$Òs0R 9ò†€út¡Q££qDr‚¯žƒ‚Ö(BâÌq×–)qæ¸[.7‚FEŽyV¦çX,hTPÐDŠÄ™£¬5!UâŒp—ö‹_ê#"£3‘eúz Œû±s˜5}=Ç"Å™Ãlùë[âœó HOT0G™ž¨õ©¢U9¤š¾ƒs Us–çà¤8sHiöTÁ'†TB%ÒÐ'Dò}´Ê]“#“²Le6Ô¤™”%”™š„‘‰Fæø‘¼{ŽÌ†&åø)*6Gf I9~Tߘ”eŸê‚e™£gºÜý4ÑÈ}fPïT쉬#–N‘Å•cE¥äP**Ed@–‰d©Q9T³GI ¦þÌ¡šM$\½NÕ˜À:ÕT‰ì3lr¤¦(ãÊ¡áa“#µL !9Nñ¨(—‘Ú¡9s¥ç@­D²jÑXd"9`lŒ‹¸0Ô¢Ô-ÊQ0Ô19rƒHò·sän|¼²ã‰äJˆ6¦Ì«:8Gn I)s¼Ô˜MJ±«~9pjÅÛç…aGÁ—SÀjcêÆ†AÀ~#uZ”öøHÝxîQu1ÑÈ~Ö›>©%i§‘ †q™¹¡I)Ð¥·r¥¦ sÑë~«K’fe‘@9-÷D“R|dn kœz/7¾šfªgr¡¦,S^ž¤X¨ÑªT,Zþz.ԭ‚¦Úäp§0£¹»R5R–)O§îŸJéxH`¸£QX½øV4PÈqMê)"E²L½²T‰rža?R7V4*µˆz}ä@…Sêô‘ã£QÙùB–Ä™ßüí-qfWkö ØkhTj‘9…TLÙD†…—žÄ™ë!i.*"!iÂ@‹%jÝ=rR\hÔ>ã|䬠4SmHÃŽ\¸)ÍìÇð39-œ%``ÝÎF•«ÜŠèìDê­˜Ii˜7~fQšå +ÔQsjV ËJå˜;}•§g£J)§orâ,"g`œ;fÉ.q7ªÛDæéãœN¹Ê$rôûHõˆogXT9›PáÊ/(”fÉæªXÇùHœa“ëø@›*'>‘Aa–lÛt¹Ô¿QÚ±ˆFή@3›GñHu¹Ñ&´DçìjhÔ€žI‹r9Ê{ŒNiæìI5r¾5´2ÕúPoaÂèžš#çÛ…F圗© )ÍÎI $g ¥‰jé­à`­·0Ѫq´iRN´*+1üVHœ©¥Ý¥1%N˜~kA÷DRV³0)Ѭü‚´üÈIIqæ$—XìÑ.éæ‘*u‰£ˆGÎÑ6ͳ9IÚ”oÊ:9I)Íy¡iORš°=UÎÂþ È:-Èi[Ѧue²¸H¤Zš©2)Íuì±BÒÄ%ßœÇ&åôµ0‘Ѥ}ìø4òŸÐ†œ¾z'Í>Ðm¤9*YîÛxÜüd"ëô]Nì´8£¦ÊsßmNŠD¸_#BmŸHò#›¢¬²þÉõú5‘å粃3*l=?Ó(ÊšÚKOíNQVYvD;ˆDÂ&q*Ë'\Ž¥ŠF­Ge¦> 4k=Š,ç1¥Y¡‰4l­¼«mJ­3ü÷Qsq–¼S¬”eM%#ò ,kZ`ÓȆÂH$<í²ª¨i"Ë–vTN·¨²¯ˆ4 ³¦Æpw¥†DR=Tj$21ýˆL˜È>UN%qÖœv®2*væ´SOdÝ/´s õ‘Z¥¡U˜éF¸ÛÈ/ž¡ÙŠ3(D"SâÌY<\òÂLIä¬Ù‘ŠæB«ržiŸÙb<2¡©yP®¬]ÒÄŒTm² :•6‹fb¤.‚ÑY'Õ ‘E£³b¶U![òÌI%S;Æ%y.1¸ÓOà,‰­CZ.q´PSCRœ0œL‰3'Š»4»2ë×`6P/DÐòJäœlDPD‰toÌ#ûâl×ô<‹ìÛÊrαE¤FƒáÙJ¹½4<¦Œ‘Ey¶··6åÙÊ9ˆ@Z‹9Êy+õ,ÏVÏ2)Xž­ž ~Lšg‰¬Ó®Ô|x©E1 $4 ›¼i|¶\«T˜6h–XurÚ•'Ži¤î"u$ä‰CõèâÖ?p㑳¸qIdÂ#2)Oœ®\þÔ¢ÏT”$,=•S.ülîî‰-Ú”mÓ„š©“)ÇTõ:mš9À Çžµ¬.dP8b›9ä`uâ \2ÏàÙ^·fá`ìçµa™•‹n`?ïêUn™ž¼3‡%ìNìÌUpjr˜Øšo¿”d¯ãVÌ„$±Ç7ØTK«N¡UíX¸3ÿ fgoq nììð™H§4±v1ƒ›ˆ.]E$hvö~'f㬠ìcµ”Í,ÒÄÆU›‘™3CûTÏ™ŸÀ.ÛRwr®¨1Ô…~ã…šÚ3•#dÙaÜ !“;ˆ>‹·3+£[E}wpæö…ÚÙÍQ$Êzi£I”8‹йÀ~Σ&§lNlÖ´°á˜6'¶fntêFÖx‡•È̦Q”8’RR9Bþã¦.'ždx˜AC2°crÇuC`7ä•Ê²ÄæÇ/Mî F9{㙺6'¶1Òr3'í 2<Ô&Øð†„[ظ'Â{ "Co¥ØµÍì\ˆÒû"‹›Y~KÚÙבU*G¾•:Ìý¥ãñ€õ~ži”'Lóó Ïdžøy†çã#ÛßJ} »sÄ>õIõ»s`«:Ce™§]©!Q˜ºn;ôÊÁ±¨JN³U†±êbBÅË~iJ ›g4D–º·úJ ˆ¢fÕJ僷`6?S)QXxRK뢽°ßd ¬‹º1`›iµ[O0v—Y´µ¹×™8õ•±w"_jáÜJíXQŒUxÓ­˜ÈÙ,CBì§'ö·âÄÙk3ÐP`"ÝòÞýŠ«{ð'6“J¦ËÖ´N¤{û·/º–™j܉ ʱ¡݉DÚ“QNœúK…åMœJPð&NÔf•[1So­î9obGýnN’Þ°lˆÀ›XPLŠCƒxת—öQ}ð/N4jŸý ¼‰…È™b»Ò«˜æ20z'N.«ŸáÄž8¹t'7ú.&N.eô¿¸‰,Ì È³ÜŽCè_œ@ŠÕ!ü‹©q'Ž.Õˆ¯âÄÁe÷ô*N\žR¸ L\jÁ¿XQJ½ìà ´ªßü‹‘³ÍÝ^ÅYäÖ"B¯âÄi¦û´Ó«8qš9Ð1qš©³AÌí ä¸8ö WqâxS ÿ–`âxÓÝ>¸H¤Ÿ*§†¼PÚ’ùàÞ ‘8 ´™&Î@e™ÀçXЬÛÑËj‰3P¦¨(cTåèhvSñ3CÅÂ"€nʼnsR©V8! šÕ‡×y8!‡|­8q”ªwfÕèg÷'ÝŠg«ÚJÂ)É1=«vÏ8á`Q}ç”8Uàgx¢1qüê‚SGV´iœx%mgͺ¼Œ,#]âÇë¿ý[‡¶2¥öòO€EF"áU:wq?(`dâœWŠ~Jq¼œ{ÓAD¦(U5‘cÎìæ8žPø.'šyó m]á’Wé»ìB8Ï)’fX[T8/)Íð–)8¨²ƒ+Ö…Õ„ÐêM„. "TCîLŠ3|¼UéÎÜBBåz‰l•“6Óà·ì«M„> "ì°ÊLj>UBâ<Ž­ çîBš ÞX¦ˆ µ³^gØ œHÕÏ­f×&qF<éÕÞE] ¨|˜ÈPÖ)i—Z½ƒADå¶Kó9ì¯H„ÎE"EUiô`©*¸u sÊ=QéíBº>Õè]$b g¦«ÑŒ{¤_–¥©–¥7ĎѾ_"ˬÕ¸‡eùŒLËòY–å ô.¾@èÀ¸ÿÖ¨æ3Ò-Ì[Ü‹/aÜ7tЇq×9c[œóL¸,Î[7*êu ŒÞñB2Aƽô"nò´„cZžgÝ‹÷ã$5d›BBŸÂ¡…‡›ÊíÉ…4;»Åy†è¤s‘ÀåbéÂà¸^ªï\–¦7‰lKSç”&Hªê»èê#Rü U%§áVmÖ°0}˜Um¦ÜOÞEçâý_p.¸ôÒ¦º¢VXzi ³i¬0eêKí²é^$r©‚0nªtÒò[”Ù½ÞÚËÒ¬2W*\·’&? ¿m+Ö†Fh©áf³Âú¹Œð€6‘aY^Ö…áwªæÐÕ„hÁ“ÛB*[· iÆ’O¤JšcËê®E.Ò[¥Ð¾%ª`¡ ƒHõ3SâvÆVMç˜ÚˆWM¥ áC…ÑÔçÝrVá^$ØLU@Ñ—ê4‡Oé*Œ¨BºŸY4>o+k…EiÂÒ·Û%iïÍ©’æh^ÌŠ6\DT½Öe{b¡—ZHžpû™)yó Òdš2!Ü¥8 ÅSÑt€}Dy4W:’CˆúiÏ,—;e{ÂÂQmú’í‰ø5¼%ξ´ªø(Å™ˆd×ýÙšªô5w!~iÈöìq†äI§¦ªÎ˜”æ±Ú*†YiB¤‚0\iz[¯bÔSœ½ŸÎ‰&q ±zþÓˆôà’:’Yé·æÍô ¿µ$N,Hª`lɳ;Ä¡–I#M`x­e{^¶_Êl²=æ 4Û~ò!a& %_æÔN¢-ê‰l™žÍgÚ^mšžÇä®ðj_F<ÍV“4[øS«k#a( dxb¿£o¯)Y6»?+ßÚGôÓê}y#ÑO«7¼‹ÜGxìê}DÓ¶«E²LÌ›p1Ãûˆz¦Çï#ÊÑ8{yá–D¶LOlkXæËý•sn˜¶½šöÕû‘Zåþ#¢ñG:š…f2%L˜UCÈ¢0kXºpªs'Ã&¤Èô<inöm¤¨‚¥{gØm¹å`÷ΰل…ã[‰³3¬ô¼³YU˜‰lï «šˆ7†E§ •®ø.DÃÑä4=«Ýë‰ ý¼Tj JÑ™ªn’f±¿6‘­D¹õ^»dzž¿DŠLÏ¢H¨š„ ‹Yܺ„Y∮ í#ÎN;‘)Ó³të-øóiz¢ý©-az¿^áà§,K³N¯ˆ´PO£rîÓô<»þJ—¿ÍÄÚC²ÔRHdúdÀ§A4=¯}ä¸dzb°èã£H–×R\DEXeyÍ#¨Ñµ¸æÔ2=¯c߃$@ÓórüsEì@ÑÂTãzà‘ˆÖEûˆ«ŸÁU–ç‰M¤Éò¼ªd’æ9l© .`3‹•(‚ ¸“@p™€-ÃóòÑiŽ:'ÌO©I#­ˆ@€4a ¹ÿ&5Nƒ$\8»„$à„kÇé½I]IÄrYt0ò”I,ú'l5OŸEOÞEÿ¢«T½EãDlž'æâFDÊq µèÐkú-ú0ˆ\ªñæÁ„}éÎÙt0N˜ R¾ˆuþÝiyâxÍ]ß9–bˆš°iŠñN+¢!°¢U³AˆhÔr ^"4\yا& >¢-ÿm!4Ùçu‚¨+"&`{^êH"tg1°%Ìì}}»ÊgÇS=ŒD$…†iŒ6M;¤¡ƒç•’ƒ,ŒT#SÒœÓꥺ‰h µÊC\ž„6#…–'ö.î®Ú$ÍyŒŒV»¤© ‘ÁöDÓÈä)öl§·raaê鬺%Íẏ&o8i)Psƾ;Ì­ˆçØ<ïµ½€pŽf  I3ûVám6~ËÓÁHÄŸê—N±#¼H"æƒÒŒaMÛRGRš1η:Œ<–؇AP¢Sì³öƒ™CyžXŽÊH‘­“n*Ud¯BüHÕ)vœ…¾¥†¤8(ndHœØèS#$Îáh²Dè`LÄT‰ jLO ÒA æPœØI¨dlÉ8Ú¶‚™C¯„|HDº¼ãÖ:ÆÆžÀOÉs´Û§–ä9n}1/y%Æ­/&P‰¸Û§}ZZˆt T®1"Ãn‰í ¨9ØJàäã|kÑ-qüÌœ0" ç)åÙÃóuU‰“~;M>‰TCŸDïg¬§ª¡4{;c}M‰³Ÿ4l$pâã±¾/y%zñ§6:´x!t†Ò”7’H—4$"`Ð'¦)ŸD;«/‚kè“ÀîËÈ–0ÆËv#܆Âlç¼´º˜Ú°‚ALO R0ýrL5û$*Br(Ìv–säc:K ƒtº-· æÈ3e~T1‡ÂlŽ I¤Q˜íìáÇCaÂî52䘪ŽE®ˆìé ¤Y’gõ¡pE¬剽²‘"'S=Ë+Â`zâ²é´=qP)ãAÝÈe$$ÐjBEŒ½LUg ༿%>Ps虪ÅÇ©;"Ž~« æP Å^ùЏ":™Ê9«@\ß*g+ nŽ|†Óæ¸9h™V(½Oã9d9{‰ëðï*¢‘`~òlX@—<Û*ÀŽÆ¢hÐ jÎÖïâ2ìf,Žj¯ æ ¶é¬ æl#îŦÐ3ª¡ jÇÀµ=´äãgâÛoÉ“ÄC{LIó:kgö3^aó¸Ã|‰x¼!”­ºÆé}ºŸŽÛR@5`/ãÕÎXÃ)%ÚtñSm qßäRGY"EÈ´›ñ:ÛìŽuvñX›bHíC‡H„°­Ê}#òbÀ}á©8¹dñTœ\hN6åÂv׬â—Îâ€X-+‚ö婨 €ÅSqq%RüÌdx¼2îžETÀsãîY¤\ñT{1‘c4€¡ƒð&z€ôÖM ˆ5Õ¦íô©¡b/&2=·~éïíÇ=²1#aà™F*#á½ZF8ωTÑmpyéTœ‹5«î—£%¤Y%Lx!å’(Sš£ÐÁHäò3•qM{n÷Ë(âHÁM7 ŠÁ]@H”szn d aM{:$ ‚×Î. äJò0Ž©’ÿìÖú çP’SQ|䜵¨o*CíÞÉ!`JŒæ:Õ!Ò"MÑÈj x8»ú¡‰ /¨{†ät!—‘.aÆY>GaÆYGcðGXg š1M@ª‘íWÎrˆø:Š2º'Æ0mqßÜAÍ™¬Þ9M:Ì‹};)]) ÅÈ”(OÔP&.’ݪ®þDÜ9C )pb»‘&YÂcm„ÜEšîCTÜÜî›1ýÒÙQ›ÃP˜á°Ý:L^âéEÒŽÓ¯ äÍF%¸90Õa1üVµÞ&/‚/ìùSò¼ÿ"£`˜[ÁÍŒùÙÞ!ƒ›Ã·ú¶Þ@°!Ez8„u˜ÁFó4ÂqÿÌé·Î üŠ4©‘a#‚t„=L`âîYÕ/µ£=–XR’°ö0ƒñ¸T‡Œ­°úXËÁM×éž%š«})¸©ƒîa ã¾±‚¢C‘Âii¤k ´yÔPŸùPAÑÑ[qô‡9ŒÛ<Ѧ0"Êd Ij7ÿ»RˆKiÈ‘ÚM!Î5D^d$‹ yH5"†Ô¾Š‚›CùW²+¸9”dÝžŠaòâ>Ì› rÂÔöíì½uöö"SÑk˜½È”EˆØ‹ûvà•îE†©u#äH1È€8RÌ> ›½¸›¨†Ù‹ˆ2 #âH!¯Á6"ŽÔ>Q7䊿8­"´”‚¼h†é‹@ª‘Æ8µbveEô©^ ±Êk˜½¤{ÑTÃÙ‹ûvz n8R@Šq¤ÕgDüÅ]Κæ/)Fè` D{u#bIíÛi%b_Ç¢A&0"ŒLƒ:¢à,‰å #$‚Ù- ½Ò"/n­»aæ"Ü,·!zShè= aqÕf.ñÌ0sq_ŽÎ«aæ"³u?jËSJDü(Ää…1·'»4Ì\\·SHðr@wC´Ÿ´5x9êÜ'6ñ½ H)FD^DР”u˜¼ˆÀÂe„ÞE"ňRˆFôQDw ßÉ2"ò"bDäED5z,1¤ù8ˆ!µn§Ž`æ 6ëœ:†Ù‹ÈÈâA"ö"‘-†Â.=F¶RÍô 1ˆ:ÐôEDsJ2›+F aŒ¼Ep=êñZ§Ù‹ #b/‘†7t7›6#¢G!¡”ɼHp y«Í€È‹ˆj•*™…}ëvÆvÌN R%³ˆµpÆhDôEÐn#¢/®Û#"¯±ƒ@Øm? ¡¹Z!§é‹@´BNÓ×<+ä4}!¾Ú傳T"I!.Xjkš¾ˆØámd:ôØ.ÉYé^Ìᳵ䀜Šõå&†-9ÓäED-#"/.ØŒ’K£[‡H5"Š¢Ÿ59NŠ"¤59§É‹@t²;E^DTõ0 ’©Ýé]$) Ո؋ˆÎFÄ^Dø¶ø4{H5"’‚¾ÝéC$©5ÌYNDôÅ¥˜"¢/"x|¡{1ÖˆÓëC,) ÕYR‹ÑCüMòâÂ~¿Í]\ 8"B³‡åîôEj)L‰ˆ(R@Üéæ."fÞnîâ×éôà1:wzˆ#…Ø{÷ú¤ #Ÿï^7wˆ‡º¹‹ëäÄIÂq‡5Å’âqnæ"ˆÚ_O3Pïqnêâ-ľ‚ƒ$(èK4©ÕýSÄÅÕíæ-‚¶`ݲèZ$bݲèZ ¬[–8R DX·˜¸HŠ„×í|ÄÐÝÖí|qnQ¤Öí|ÌP¤HÆPO™¼ÂÆ4"ò¢)‰€™3ø-ç ¨`æÀà$ï#„ˆ¼D}™½¶H7"ö"%K€8RŠø/ò÷ÙX.PAI‘e¸L]RŒÐ±H¢„|¬ U€µê ž[Eô( ZD—©‹ Ähž.S×É1•pˆhž‚ž1IÓèž§ áÀè\©—Qñ_ÍÓeî"žÕ ÁWYŒ™aëMˆ:/HѰY¦.¢VÛˆ¨‹¬§ú¢‰…¶hØ@bà»±uFÄ] Iãf™»È>QË]‹D.#¢G¡'5n0Xat‚ñ$C`™»ÄãFÜEDvçÚ S íô-†¸U¦É1vÝ-³ÉÇRÃM_\'§Y¥’!ÇÆÜøJÕ„F]&U(4°Ý€HÙ,ó1 µ®.ó×íüê{ R6PÒ†¸Oºž¥œUu™½DgÇXD(Îëxî°Áð¢êgd€á¦˜¼ˆ©¦#•eò"þIÏb¬“Y®b †Ù‰I, +9™N‡‘T—Ù‹ àyðOzÊ@‹l*@ æÈ ±)ÎØŸæGí;˧‘Âtn¿E=‹.#âG‘WhDÜEh8…¶.sho·Ì]„^ÔÉ5¬Í`«®377¯DŠ~# _e/q¡‚=7]‹D<·(RPÜž¿›Î ø¹M\/¬  [1æ:Ñ8ØMê¶L#¯Ø•ÀèäŠQ„ˆ…%EÑÙÛ¼E jÀ6q¤Ðn„~ÅÀÒ$3û®%@[=nߨ¤Ë†6}æ4´n [1HZUÊÙívlÉ,‘sl¹M]Ä‚+ äLD´ÃÆÎF'(³nCåA]€Vë6˜ºĨ!aÎs†‹¶¡ž6Tº‰ht](½nÃa.ÎËZ' ”å<‹ï–_-`‹¸ ðÆ !nƒÖØ€ã6´-yÆñrîÃ]Œ[ãÜKÈmè$I¬%7¢wÉÁ0L]<»XœŠQœÌ *„žÅIÚc©Óy°Ô<–F‘<£ž±tÈ‹·ãMž²ÇÛ‡“Ų„h6à<V'hÜš ND?·„9Ì1­[Îô€é©ùŒÕ-@ÓyËm°W5qxKa޳o“h=ƹqe9g=ÆÙ2¬Î9½b›½D:ÉɵêgòâÇû‡ô‹M:Ï8dolÕ9ùÅÉü4"½ºM^„9/½J'€eµJÏA"½ ÌNÓö‰ˆ½DG!pdPšÝÛ\øC I°&âT¸O`x)~†Y8I”ÕÚ°Å_ ¤ÐÚw…ÙÏQ0œ@‹U®6¥áL*lÕ Þ n" å N*Vïzr±KÒì&-U¸Ã°‡˜Í tƒËlí;fo»öE„ tƒÃŽÒl^ ½|CO†Û%Ö]`ÛGÛ´ÑHÎðmÚà–¼ŒÐ6mt]¢™Í¼ îMì!°Åܪ!'vœª^á. "T=±‰\ª^™f+2“Ú¥XÅÀævªz…î±p. U ìˆ T ³ÚyÚ຦0«§íÒ1g`_=UA޹TA¨vã]S/°c_ª ™zª>.¦^ åF¨³šü³êËM>E4ÕNÌER»§Ÿ‘O‘©=T—&Ÿ"†êÒh¢‚lÕEÍDª:«Ë§ˆƒŠPõ:åCäRõ:é¸ã®ú€»ø@îùRuÈ/޼iV¡(Kh—Ùâ!ÄãJ‘ðá´'DäVÄá‹ÇÕ_ˆÇ•ˆ‹#5R2ã=¬ä"â‘%ßQàäÇ#KD "Y!·"Ï‹Tð¸ŠÓ/E‚ý帤†(+Š’»*ò*¸T›\Ò°‰ÀQUWmRa’`sVÕfrÉ RT¥= œ Õfʯˆ”5[ßšr,iªâ'™HÀñ9Là)¤¨>K®EœÀ ÕÌEÎ-×åGŠýåˆÙ†hAÚ×%›¼!Æ0Œ\ªÎâa@àøOmXò-â„p©6¢‹ñPßr_àXÑ’Q¶D"–Ì–oy<ç7¼Àé¤E³I¢ g"2•e¡[2°Îõ[‚a^åW¢)C.sUj‹©×¦¤Ë‡× qîç2õ©!^é/¼ñn ²/B ,ç̸¬ÊÏ¿§¢‹»ÈLRe`à‘éu¾¥À!0½Î7p`y:e‘ÐK:ÌnàYPšÓA? ì Js:è§9™#‘¦O#~Ò‰@¦¾ÝåT¤ë@íu­œMT¬  L¥j Íô)@ ¨6,ÅÇÛ ¤ž*@Z ˆ·pl }zT¥?9yJ¸KU€”ó?Yg°,cÁ6– Ì3ØÏÃùÏ€O‰H?“ÐÖ•6Å£-äY¢úE—,ã,û$ ¸ÔÊà./àjú¶x‹_‘ÖLä¤,Ã,VÈ[ §y#Ðhv*¥K+J6ð@uµ´E´ql” JR©?ˆ,î àÛ yÓ褷Km\ Ë ¤¥ëú4ö†Sùe¤ØÀÉY¤×Ê¢!p©I¯”£ˆ§Ü.LSӽↈG(Å €}I–£yöl9áÍóìÙ¤¡ñìk1àôìQJ†@ʾ­/‰µH¤©™ Ô¸UaùÕÐÆlõ¢OîGu:9ewœU«Ê]FDºº^ $”®#GoùȼCYvoç‘kˆÔ5(9ØC„RÏ©~Ë—$B'#)…*ÞbDwޜŠ˜¾UäZ„Ãvø[ôšœºn—h4D¤ÀÉ¡<Û¶Ý NåÙŽyP•¾%ÊQM¯Ü‘p³D\ æô§–ŠSCJ®E n¢E»R'¹Y¢[‘lZ“<[?­q1àw«%NYIdú­zZÕxpCÄ­ê—$Š$ò,F+§Uœ@ºL·J!"¯½[Õé,"âV)%àëw«”툅Õå\D„€›5XHœ6‰¶HÄ#p4I³ŽÓ&ñ‰¸MƒJ.œà¨”9D4¯ªˆ‹LråF‰¸H@ê¨D4¯ÀÂ)¬O9 ¹0€¸QÊ6ˆ§ðÌq‘ˆ¬ ðrðRÙ§Y¡Ü‹È™ê‰¥4 Dô%у±ê¬Ù$Í2O«Ü‘¶-gðSÎZЪ¨‹DºK–o$RUÔE"Ò`æp§ˆID.Œ(Ç„¨â.‚VdBTΆr쇺äZÒü¡¥T]Å­îK?¥Ô‘m”²D¬¬ê/Þ")upp°@ˆ_~ÉœRÍÎËçø­Š¶ˆÔÑ:UE[$¢ÍX9ØG2¼§ QòŸì o`å`ó ™àÎZÊÌlZ}¶!D«/X9ü”OöH942Ì2ù"^v1r/2Q:%©Ç&âb ‚3üŒ¼‹@¤q3³iÎëHOyi‰XzK> D‹Zz".r»[z".±ô¶¼‹ˆ:µô˜çœ€¥GÞ"\Zx".†óÊ‘sñ­Þ–wˆ…·åÃ@~z ¯‹¹ˆ“•𺘋D$<°r”Ló"¸‡É4ã"`å[eïCëb.).YîEäÔ.™îE„öjò‚‡”ñ‘ÁZ º¸‹D´tqaÄZ p76“@´€•ëS·pvÔÞ‰uQ™|T;±.ê"”árì%ÔÜUp•Ïjƒ˜‹š ¦iN¥7¶÷9ñi'g±QÇ4A"ß²…È4éí$G=¦Iu‘ˆLÜŽC­Ý·72 å`7‰´«Û%ˇDû³Þœµ;¯uqÃ76‘ƒ¡ãÚqₜ&ÀOÈ‹ps­y]ÔE"—˕ѷE‘ˆF)H8°=ÈîQ*êb ØÝ£TÜE"¥Ê4Ì´¥C>F .X^ \o¡¢‹ºHD Du1{¯f]Œd° =1ŒO¦¿ 'm¬»˜‹»6ºŸ‘‹÷q,U/äb¢ãç5f¦]­í¸"§,!rt1t1‰H“"÷qeÆ^åIi]ç x.Џ`.x.’¸È¼¿ž‹".ñ\\r1‚¡…—äÔ-ÄsQÜÅð…&Däb⹸äbÙÂÅÈÃ@& 88ðb ¡ú‰ºHD&Lw1Àê 6@´bà–>â'­+·}€¢£‹¼HD+Fy1@(q;·\Œ@´àã–œÂV9»h"/Ñ‚?D^dæ)@ÆqrÓ7ps[uY瀛³ºËÅÈÉHR Û9Ä]d®g™jàæl2ÖpK PÜ|£v‚š3BˆÚ9Ä] 2rÈÇÈûs\Œ|ŒxÔÍ,bGq3«<ø€*#æ"7SÌEÜÎxšYåcâf"Œ’ª§™*µœ6’·H@²â-o R›Œ@ÜÆ&G:Q²â-q#›<Œ$A©‘š·DªË‘‡âQ1ýr"ïy)Úb@¦³C´E"nd—ƒ#Áìt0¸\Œ r¹b.Æ“Û)æ"ÍM,‹­ª§ƒåD47±"ѽ>ц˜‹DÜÎ!#¸gÓåÈÅ蛢ˆp-fVs7TÌE"ÒA6sÉ@Ó/) ˜ Ìå¾}³@ƒ™Â\îÛ‘Œmˆ¹HÄÈÁˆI,c–s¹oÇW4XlÌå¾Íh°ó˜Ì}놔ÛYù·“è¶aÞ"s¹«¯¦Œ úM3Ëý=°Šù’o9lC´Å~îØh6È™5^û_öÌÊ¿Mh0þ™•9½I¦-öåŒ6L[$YQ’3mÈåräb„2Õ²‰ÝŒÏ[û6L[ìëœÈ`[FY.e4lø˜–9áIÃU^ÝÖ¶‘°>4#/#Ô¿lØ0y‘<Í)D^Æ.bñ£ú¹Û¤al–“ ´0{Hq9ÓÉù„£&ç_¾Ä¬á‚Éùçöa†O-ˆÈZ³±òÉZÇIp¹¹ÁYí.†æOx%"?#îbägIJ«ùг£U…H/áT æ'ï)P9:Ë"¢ùæ/‚g»\ŽüŒý\*Ó|ø°¦Ë‘ŸˆÆ2Žþª/IP1<.$ ‘&0úJ>"r3Ú!ÂE€+.FÎ ÅåÈÏKf¸ùh,û$7º27¡w˜ˆÆr˜Ã«Ig>}æmÛåÈϤ»úa|mÃm+Yºa £/5$"O#íÇpÂíçk(½U@s1rh€Ÿ½\Œ¼QÑoÉÓ(û‘€¤yk „XR0:µðÀËÒ}'†2|3ç°±$W—"?#(æžWØI†âRäg„ l›¿D*Î.ŠsŒ#à)?# x’kÉ{=,`óo7}48ù(ÎÑŽ€§@,à)G#ìx ˜^IÚÊÀ•9u§ˆÅ»º¤éɺädÄvÁÂE,%šÔ÷î’7£Ÿ| ^^ʲ/ ×ÔEž¾[^FìU<}å—ï^ˆtÚžØáxúšºØE­%"7#RxúnºhöÂeÛ['­Dpô#š½ˆ 0»¯Élˆ2([ˆ‹‘Ÿi¦‹¡Ç‚ˆŽbAYöâýb'(Ë®„0¸H›; lþ4·Q»jD¾ŒÛ1 !Ûˆô©tš2Eñ#"›ñ+›—Ó8δ9†ˆì)DÏ„¯« #r42Ñ„ÚP™F;x+¬zùhX;Dˆ÷àhX#°ˆâlÝc ÑHg3í£!ªéšB4¬ùÄG|qK›â/РvÈïàÑ F V!þR“§97†‘Më3þìò3âD@±g”euf†6ì#n×ÿ4¾Eóˆˆ@dF"Ǝ¼9h™Gaúª¸Æk%xÏì+ÂôìõØW„éÙOöôæøC"݈8-Ñ~±ŽQ…Èðà-ïl•CZ¢,›MhDbR˜Õä":¯"DÚq Í×'-#]¦gu›†T {}WaýŒàVì%«EA²´>Ë9gBh-ÍÏ2ϧ¦üŒ@\" ¡%NÓúKDG F³Ê‰™A˜±n…:6b“)ÐrŒ.D4S ¥Ÿo­ªk¡J;õÁ±±-Tˆ¸fýÎÑâ¶)Ðr¼bõ¦@qñš¾­q"nù¾d–['ï"_lÖ¯N^ûè²MFÄ-ßr4â(Ð-ß!ûóZ§å[ŽF ºåØgL!jùâ¸ù~À# õy9“PÕ€ÖçåˆÚÃeD 'Í—| ä]òuL0,tÉ×éb1ºW¦‰órz…æËNˆ¨áà‰p;q9Ç@»„Öçu¼i`©Pœ—³ 70Y†€ó©Íý“) ©r4úÒs"ä¯ò~³mDžF nºh>#b7]ä "nzeÿ–Ï·äÒâú´K—¶‹&Ú2±ÝÜF IU^ÑvÌ2uB€æùÒmó¼¶Mó,®fD:<à[¦f6ðtöâOuFɲZ¹:Xh¢ƒ–s Ý'Z\[B¤ã@Ôùé{ì‰0J€ˆëcc;7s4Pu Q ݈üÍâÜ­2ué;ƒÑ•¤ÙÁ]¤8×9ÓM‡â\çL‹<ɪ{ñ´„€]Y†ËI^ -h ê,#—y‘nL+ˆ:£ ¹Œ„ߪÞk™ JD{­e#¼(ZËÍ„%¢µœüÙ©ëþ¿JDk¹©ºÁŒiFäqlóøïL 8uˆ<Ž@T1Ÿïlf-©FšÄ9g¢‘!½„T# UóCÙæ æè%ç jæo‡ýRDäq"óÍTñhó˜o$˜7!ú’Xé¼AÑïÈã@ÊLÊsž£Òæ‹ë¼ÍF^Í(=²Î0¢‰¿Íe„CNÙªÍ{uøÒ¹B¸¬ ´Ý\VÛ\FdßÓDY‡âŒ[ ²A˜ ÛH&(n¤ú-'zj`ëPœáë2=PžçVʶ•Þ6ÚÉ‘Ø@×ÙSÈeÜž`RAµ|F—ùyÿ¥ZUé3$rézɼÞf¥Ç/¸MgD†C~puæ¢ÑnßÛ£™E`‚Ñèßæ3Âs«!‰|&”çpƌƔ'K7zN#8º ;€ ,¿’ÛtÆ6NÈ’3¹ðªP‰¼Óߨ†h8)c˜£ÔÀÔÑ+Çø@v ó¤blÛlF K/)õ—ߪgŒ"aŽcãmÓ™°R}ƒ¯êöÓm`ø¥cEo嬾!µ!á¥ÙϹÚ›€‡@Jû ¤Ïôˆê—ÖÑtÃ칌µmÓH+m݈ pÁò6¶ãsf(^ò*¥Ä|REˆŽ’P€³ˆÀ¤‰ RPÁsè¥cñm‘[?ÆÈ6™ˆ•€ÉŒ­ci¿x¿l÷Íc T~±¬&aöëˆÅlF„Yh W ݈œÍ£fm]1{®ŽlÛTÆÖn=¾‹DÙÎò·5ÚÓ§Ã+†[¡ˆ˜IDc&#GÈÑØÎ=–™ìÐÆæïÈÇ †›ówu(þæï åP”ÍwÌöËdFä–eŸwutW°OŒ:2ê-‡Suu(Ëã_ë—ÈŒˆ˜a—÷ËdF ݈\LuBäÎ2ô)³\~K®FDç°×;¨:ØS¶ê›tõê¯^ýîèƒQHãî¼ÏûwrƒûîíÃ_?|û "ÏÆ<üáUyø‹üÿß¿ºþ\×g¯Ž%ÒÎ7pá1»ÆAð‰Ÿ>uC@«ÜzŠY©²÷ŸŸº!wOý¸ü»/Þ=u=ü]6+[…ÿù?_|óðß>}õ‹_–Ô˜¹~§Ìëç¿É¦ð™^ö“F6<Y»‡O¿yõëÇëõ›r1Iùãxýf“ø?Ëõúo>ý‹Wöiv^AÖwlzA_ÊMæ77„9(iÐüê}OáBƒõŒ¼x ªtõû§Œ¼xÊÄ€»§nT_ý¤ÏOÝ×ë_ÙGèŸ7è¨Âø¶úÀ³\EÙIoÊë7 )¥÷F‡5fÙíÅöýXÚ_G~†HŽ«Òt…Ö»·ÿújÑ1©:D‡ÓJÑ=þÓëOÿþ¹Þ¼XAûß´ƒ&ŸøË¯êgÿôÙk<Ȫa&üËÕãløu– FÛ•äoòï/?4?~"ÑîËæ^Hôƒócâ"‚~›§ïï•T8Á»RßÞuJ‰p©®ÔôhíÛw¿¹µö¿Ì=ÖÝ+ #¶TÂ×ç_¦<¿ú>%‡Ð—«=þðÛ×XX{î÷ã[à }ÔÇÿ#ÿÆ?lp½ß½ûîݳˆY»Üé¼ûðD–Þ´Ü®59`¢˜)’ƒ+GΑÎÏMé—͹•‡xƒú¢~ýø›»öüžãüs?~{‡¡¶-ÜúøÃWß}{÷Ü8}S?¿Ç¿|þñc©i4ì`ˆâ‹Ê‘ôc.?úÕßû¡—2Fú¾æg¾x_1üˆ2H¿ûæîêúõÛû~óâ×·¯©þg}üáã×ïk Nëæº –çÆ¼oÿ*ãñÿú#½•€àòøæùÏÛ`Ô~$>œçæÝøÝ2ïûøñE¥ß° 7<ÖË­ä›B‡7_ÿ?ïäúí˱Ì÷g–¿it…ÇÏ¿?­Þ/*…i¹º¾AZ“ ÂÆßWâÝo^¿á-…×xüìñ”ò²i8r;R‘Šúñ‡° Í pZ~Å Wyü„E‚{!óùÎÐ6 zž$ÜDýª‡i²3:ÎW;Ê+óóç´ÿÚï›N¸z¡³@d'Xœžÿpû2ƒhþJvdx†®¨ÛGõóç>Úß;‡ð­Uzc©„ÿ¨nË ¶P <×d¯õ!)Ð*Ù+ÿÓÝ;ïT ßH[ò ’MŒT×wrX÷¾ëoå2óc*õ2Ÿ¼\ä˪"ü#µ'.|-iWrŠ»ÈqW$bá°Bäuµ­:þ»÷ÔfÈ,Ńä=Qr“ŽøìÉæ"nz¦‚O½Vêº?®.G^¹2¾k.Ôˆ/øÏïÓo@“H“3û®ŠÜ:pZÉõ:¯ŽyÂØÃÖŽ”þÿî~f}ÿbiøÝï:éô/Ö4+™¯ÿù5Nf®œE9ÝáâLkûño1ôS`åñ»\†ôå±ß£ÁGn8×ã½6þ9 þ½‹J…òýWÖ‹*!«ÁÂÇ?÷?ü¬>¾{1ÑïUéçï>©?x÷Õÿ{ÿûó¾z C¡§2Ìj¼Á YncŠ«ñøÝoNËÎZ{Óo¬Ê,/s¿f}ó>®«Õè×ùÉÄ¿ä친ÑõõHûí1—kðÐZŒúøÍç_ü~‡DÂ+Í_¾zü÷©ÑþÓO‡>ÎoCõƒú¬ÏùA}ö£‰ Ú,â¯P2Êýå{' 4ïŸÇ÷“î ¶]˜Moàû;såß•÷NdèÔ|4÷wÙÛÁ'ÿäým:KyöÊ{gòúï—3øe˜D¹>žb^¿¯œídMüÌ—ï-™ÁzœO}âG^,Ø8•¾­(ÿðíwï¾ù°õVx;ÂúÃo?´à¾˜ï[éš›LôOÞ÷-ĤCgßYàïåÆö'3xn)><‚õLnÐ>l$¼Ð_ý 2âñŸ]~.Û¿¹{äP-ï]ò;÷ ×ÿÇÑ´ç¿4šV¼g’UcªÖ‹å )2r;øF`ßZ³Ê­ˆŽèºh½v¬äÄÞË?Ö|ï1îuéÞF¨Ýø‘õ@Ÿ@~qðÆÓždôßò³Ÿïû¬ÐpÂFþ÷¶¥ø‘:Á±OÎG÷ñ|Ÿàb-wO¸Ò³ÿÜ2Ÿæ1´Èk¯ÿß–y+ÃúÞi{–yþÂùW*ƒ/^ íôé“'<ñ¦ó† ‘V<ªÒ¯ÿŸÛ¨•ËyNÆ“ëý{°±rWv·‡¸ßB\óñ“³W¨õO­²¾ÿÝ»>{¬Ÿ½þÓîÚ.Ê)öß²?C„À^냻šö\¥ö¼©iÏ›šö“VÄó+%[ñ¼'úi{ÔKox!ÖªÛþåñëïþðöÝ'ÿ÷ýË_ýÙû…„ø…:ï…ô‹_Žr·¢¾ño™³P üåq}v}üâ÷ïþñíg¨ÿÇœoÚÇíü\ãñ‹ï¾>írW/½{ûåG·×R™~ýÕ7?ê3=˜Ýù¦|œ­µìx9`V4‹OÿôCõùâãóÑ4¤¾üò=5¨ŸþòüÙ­¢íÃýÛ¯ÿö#üÇ_üüo¿þêÛüäo?¹î¾øÏ¿²-_ÿðÏŸ´Ï^ÿçgñž·þñ5®|öúÖEÏßõÌ×øò“§õñóëYÓO>ú»wŸÿóG÷]’*ò=]òõÛ¿{ûí—ŸA*åV§…Nýè »îjþÑmü~ä: ÿPç  òôÒÇÏÿ†v׺úù¬0èüÐ!ÙOĤ•ùçiZ6R‡‹¿ß`¤¢Ü27„a°#s#)81Ø×¾GL… ÂPÅ‚Àú5^ “Üc"•À¦çZNÁ ©ê.˜>¬Â|.˜®¦‚ä(Õ3¨» ¡PqÁ .ȵu±d_åSœgŽHè™Å€òŸ6}€Q"iYB”¡ÀËMï"¬ Ô¬ÜÒjx‹ññ倆²•ˆª¬å›ŽÊÖuÃ^î®g&C¼ òO*ªï*paŸËîá/+ðW+­(ooCÁû\s®ômne%¥+J6Và!V^õ¢ôXå9ù~a6§ÂXnQê¡‚¤†¾½³° 3 2ŲLÜÏTàØ  ‘åðàmSšVÜ"ØPð>Ÿ‚ã1õa½®éÛ×&½æ•×lñ%Dåö½"×–/:™Ðï}70Ȫȫä—ï.â ÞJØG®K\N@ce$m ^ |.#Á’l¿¯|Ù íäM´Îõ_ˆÈ›R•-)>F"s8M+¢rsÕ×’E:Ó^ ÊiËy~âk÷€—å"êÅy¤£•x]Yw†bzëx¹–³7F óz('-F”t ’†ß.ÆðΞ“”“ƒŒ—Õ8w¡’Jó~#“i]ë89êÖe¤¼ÎÃyÕ*ótëB ¥±Ò -¼]Â9Þ& ááÝ ž˜lƒ·&8kP#G°"*:nYx%;%(³Æ ¼Î§ªnÑdþâ|¼Pš½íŒ 4[™ ÿrº†(ѽYÿ¿Lb?olòÜ2A½¢¬+’5ž'i2yºx©žŒëdòùbv#Þ˜|ÞìFùÃ}?Af*•?âFn>³‚Á!ÌEo2Í"wº2럹 ô¼q(t§§˜È ?‡¯‚À‰Ÿ&©ˆ)í‹£}Iƒ!¢À¤–¼ºÇ.NÒ ˆ8ž Qx/€ÆQ"…R‚x"áx æø¸C¶®¾GàùxÈÇÈ+ýŒªý‡Zp)k*ž›õ¶j5ýæö‰ƒÐGô“§nÒÅÚ™[Qúò©ƒÜ=Å‹¨©óÏS7äþ)«—»§r÷Tã¥Ù÷OÝû§†‚“îž:ÈÝS?n÷]OÜ=õÇøvA0Í…¨^ÕnËöÐÝßÔ»¿Ó¼ï 8¥ÑvåŸÌü;`ôŸ?ëùó±ýÔ±ygÒaŽ.N£_½ï)»eŸ Ÿç§*Óõ­»§òâ)éÿ»‡Î‚p÷Ì(÷ãÏÿîÑ|÷ÈÝø¾=…ÈžÜß=eäþ©ÓÞç§î{àu9#-7Ár9?ÁÓÌ@øÇ —‚ >)±§q~”Çrû—«æ»I½ö>Ñ}Èžýã}ÒÈKwõú3>idj*?ñÑþÄ#ýo6¶U;cûN.6¶ŸårŒmf˜“9icû±±M„Q„ÇØ¾Gdl ¹3¶ 0ÚæÛDhc›H¿7¶‰pxc›yÇØN¤È–=Æ6‘ÖîŒm¦Ò£·ýÛDJ¿3¶™€!ÙÇØ¦y@SËÆvÓ Ã±}rý=Û‰8{÷1¶™D°ÞÛL<ØïŒíŽÑic»•îû"ll3—¢ì3Û‰8büÛÌ©DÈ2¶™zRåÚØf&L~6¶®ƒ·i-c›yCm~ËØn×Ͷ–±Íd­¾xYÆvÃMǾ¡[ƶóî>Û MãÞÖÞ·=†mmý0µÑ«ãÞÒFÚôs1¥,m„»*}ö±´¡J•…Û–öz¾wÏ–6ï˜h÷–öT¢è;K¬ߪeKû¦o¦6HYºCë˜Ú1}Ÿó1µQœ¯/±© ¦¨/°©Í¬HóÞÔáPð›©=Nv¼gS»œë?Ž©ÝOüýÍÔ¯ÔˆMmXŒ'7¶Lm«lFÛÔ‰ÆY\mjûæ;S È©6mjCÎ >¦6c‡ãÞÔn‡ÐxLm„n:œMm1Þ[ÚˆîsÖ3YÚŒ•+÷–vEöÎÒnõ¶¥ÝnyÚŽ¥Ý”ŠðÙÒnå$[=–6xé¥ci·[ž³ci·ë…¥Ý®C$¦¥´aæ…ÛÒFj±Ñï-ívÝø­¶´Û-}Ù±´Û5ÇT–v»å3;–6³˜Å½¥Ý®“0äXÚ@"î-m £ÞYÚw€-m ý…¥ÝžÉ2¶´Ÿ‘ciß!²´ï[Úwˆ-ír³´ŸÍ™ŸÆ]ÝGYÝ ¡du÷懭Yf¨Ïå#ú(õ´Ë‡Áx]m@ò˜‚ÀŠZÏ÷%}Ø.~ù½GÝï*øƒFÇ!> stream xœcd`ab`ddôñ ÊÏMÌ3Ó JM/ÍI, ªüfü!ÃôC–¹»ûǺŸº¬Ý<ÌÝ<,¾_ú$øÝŸÿ»3#cxz¾s~AeQfzF‰‚‘±®.´THªTpÒSðJLÎÎ//ÎÎTHÌKQðÒóÕSðË/ f*häç)$¥f$æ¤)ä§)„¤F(„»+¸ù‡kê¡; Æg```4b`f`bdd©ú¾†ï?S²C÷ÓïÏ¿3<ÙÄxù;Ã÷©˜¬ûî/šÆÖYÛèYÓÐÒjÕ]ÛÍñÛŸí»ÈçµËžœ^µRråÊ-ûº/q|üÍzå·ÔoQC3݈m­Ó–¬˜»~aÝêx¹EûNl¼ÐÍñå°­•KŒ“«·üïÆß¹]]Ý9’?ÜÙøÊüpžõ=êäl›¸îqËq±„äópvóp¯îéíéëéÔÓ;ù8φÞÍý=ý“zú§ôNåáe`ñ†®endstream endobj 210 0 obj << /Filter /FlateDecode /Length 1672 >> stream xœÍXÛnÛF}×WI¬\s»÷K÷¡@ ¸h ÔPŸ¢eÊa!Š %% Úüm?¤³ËË.e*–Ç­CÔ^fÎÎÌΜáû!ÁtHܧþžå2¼¼P?:¬¿fùð§ñà‡+i`[bép<T[è)‰C-5¶\Çùà5z5-7Ùr”pÎ`P¡WÿÌFLa+¬@ïFÉ5%-Røa™’”£rôfü ¨áŒK®³LÞ -ïpg” ÛÞhÐwqÒj+e¦É¿«ÑâXó€T’yY?‡3±2©«Æ†jFUšðoQê+ñ­ðýJÔMï{¥oÊm@ÇÅ Ф.<´)9Ä _‚ ’´H’€„öWDGÏ`L‰ÁB[÷9ÏzÚ‰…õ ¤ZÔÃ\;E¿$¦RĪ"Ûü:-ƒÙ‹y8ñªLgÙ:+–Îu’¸£ú4éãà:Û¬ýá¡1Ñ|˜´ÚÉ}Mß46b_ŒÊ%d?&¬vÝŠÐúE H€w «”UÚö¹qßwOŸ†ç£BgÝ—7c‰Ó5ã¤e6› Ù^hÐŽ›ÀÜ|÷aºØ¦ç^¨áXhº *Kwä•€C¤$ 2]üB+~×ʉÆ`O€ùJ7zPLQn\u þ­ðϱێ«jXilÍ+vë.WŽ“ ´r©Ži*ŸbâZäÙt±ö"(ȳècÜúwY£ã¤ªâ¤WLí\À’ÌÛF¿q\ÙU¸y›Î"G}ìú•BûЮžeCÖ[(•r–U4?—EçWVÑh· ¤åÍ“)Õ•õ*вu­Þèîiv]ê¾qSÖÇ`>ÝÖ%Us,…mÓlÈfqƒ2],>ŒÀ%:?šgó xæý6+Ó z²rî-ò'M¶«2ä_^$WXQ¶ñ»P@âDZ ‚à ÿ¼É‘~§Ð ŽUÿÞ Ú%l2z+‚$¬ägnžÃÛ½eaæûî ïÝÃ`¦m»xØC¡;rs²ïõQ'ų¯ 47Á÷‡zëŸëÖ:jG ¥o»ä¡ZätÓÊm䥘©¯€ÂDå1%Î’Ÿx–&¸+Ú&ÏCdéuo¼Á‰Å†›½à­_tlËë = âÕQ¯’ &®àÿzA(¨ITð§#»ôñö¦Q°ÆÕyÎç¥ó¯ Nú;ò¬²P‡ÿ0ï!|Ó<1 k¸1„ jP©{ˆæÉ‹W­ð—ãÁïðù9þÑ»endstream endobj 211 0 obj << /Type /XRef /Length 245 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 212 /ID [<8d533fe48a478d1e31d99395846285f5>] >> stream xœcb&F~0ù‰ $À8JIò?ƒÚ6 ›Í›/nÆæÐ$ÿ3¨}Ûd €b¯Dòp‚H&y)rD²©Hæç RîXvXåÉ8D²0€Å€HÑv°x ˆäUë]"¥ªA$ëv°Ê`Ùw`Ùm@’QÖÄæö‹g‚MØ6™¬~%Xo>ØÍ`•z`6H/;ØÍ¼*`•§ÀzMþf‹€õ~ËjÙq`6ØmL¯À* Ál°J&pz›ÃwDr¼›/r§CØÌpÈøõ¾ëÛåvÌ>vÕ%6›*ˆ endstream endobj startxref 156282 %%EOF Rmpfr/inst/doc/Rmpfr-pkg.Rnw0000644000175000017500000005751713522366777015612 0ustar nileshnilesh%\documentclass[article]{jss} \documentclass[nojss,article]{jss} % ----- for the package-vignette, don't use JSS logo, etc % %__FIXME: use ..\index{} for a good "reference index" about the things we show! % \author{Martin M\"achler \\ ETH Zurich} \title{Arbitrarily Accurate Computation with \R: \\ The \pkg{Rmpfr} Package} % \def\mythanks{a version of this paper, for \pkg{nacopula} 0.4\_4, has been published % in JSS, \url{http://www.jstatsoft.org/v39/i09}.} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Martin M\"achler} %% comma-separated \Plaintitle{Arbitrarily Accurate Computation with R---The Rmpfr Package} % \Shorttitle{} % % The index entry makes it into build/vignette.rds : %\VignetteIndexEntry{Arbitrarily Accurate Computation with R Package Rmpfr} %\VignetteDepends{Rmpfr} %\VignetteDepends{gmp} %\VignetteDepends{Bessel} \SweaveOpts{engine=R,eps=FALSE,pdf=TRUE,width=7,height=4,strip.white=true,keep.source=TRUE} %% an abstract and keywords \Abstract{ The \R\ package \pkg{Rmpfr} allows to use arbitrarily precise numbers instead of \R's double precision numbers in many \R\ computations and functions. %% This is achieved by defining S4 classes of such numbers and vectors, matrices, and arrays thereof, where all arithmetic and mathematical functions work via the (GNU) MPFR C library, where MPFR is acronym for ``\emph{\textbf{M}ultiple \textbf{P}recision \textbf{F}loating-Point \textbf{R}eliably}''. MPFR is Free Software, available under the LGPL license, and itself is built on the free GNU Multiple Precision arithmetic library (GMP). Consequently, by using \pkg{Rmpfr}, you can often call your \R\ function or numerical code with mpfr--numbers instead of simple numbers, and all results will automatically be much more accurate. %% see subsection{Applications} further below: Applications by the package author include testing of Bessel or polylog functions and distribution computations, e.g. for ($\alpha$-)stable distributions and Archimedean Copulas. %% In addition, the \pkg{Rmpfr} has been used on the \code{R-help} or \code{R-devel} mailing list for high-accuracy computations, e.g., in comparison with results from other software, and also in improving existing \R\ functionality, e.g., fixing \R\ bug \href{https://bugs.R-project.org/bugzilla3/show_bug.cgi?id=14491}{\code{PR\#14491}}. } \Keywords{MPFR, Abitrary Precision, Multiple Precision Floating-Point, R} %% at least one keyword must be supplied %% publication information %% NOTE: Typically, this can be left commented and will be filled out by the technical editor %% \Volume{13} %% \Issue{9} %% \Month{September} %% \Year{2004} %% \Submitdate{2004-09-29} %% \Acceptdate{2004-09-29} %% The address of (at least) one author should be given %% in the following format: \Address{ Martin M\"achler\\ Seminar f\"ur Statistik, HG G~16\\ ETH Zurich\\ 8092 Zurich, Switzerland\\ E-mail: \email{maechler@stat.math.ethz.ch}\\ URL: \url{http://stat.ethz.ch/people/maechler} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/1/31336-5053 %% Fax: +43/1/31336-734 %% for those who use Sweave please include the following line (with % symbols): %% MM: this is "substituted" by jss.cls: %% need no \usepackage{Sweave.sty} %% Marius' packages \usepackage[american]{babel}%for American English % \usepackage{microtype}%for character protrusion and font expansion (only with pdflatex) \usepackage{amsmath}%sophisticated mathematical formulas with amstex (includes \text{}) \usepackage{mathtools}%fix amsmath deficiencies \usepackage{amssymb}%sophisticated mathematical symbols with amstex (includes \mathbb{}) % \usepackage{amsthm}%theorem environments % \usepackage{bm}%for bold math symbols: \bm (= bold math) % %NON-STANDARD:\RequirePackage{bbm}%only for indicator functions % \usepackage{enumitem}%for automatic numbering of new enumerate environments % \usepackage[ % format=hang, % % NOT for JSS: labelsep=space, % justification=justified, % singlelinecheck=false%, % % NOT for JSS: labelfont=bf % ]{caption}%for captions % \usepackage{tikz}%sophisticated graphics package % \usepackage{tabularx}%for special table environment (tabularx-table) % \usepackage{booktabs}%for table layout % This is already in jss above -- but withOUT the fontsize=\small part !! \DefineVerbatimEnvironment{Sinput}{Verbatim}{fontsize=\small,fontshape=sl} \DefineVerbatimEnvironment{Soutput}{Verbatim}{fontsize=\small} \DefineVerbatimEnvironment{Scode}{Verbatim}{fontsize=\small,fontshape=sl} % but when submitting, do get rid of too much vertical space between R % input & output, i.e. between Sinput and Soutput: \fvset{listparameters={\setlength{\topsep}{0pt}}}% !! quite an effect! %% % \newcommand*{\R}{\proglang{R}}%{\textsf{R}} \newcommand*{\Arg}[1]{\texttt{\itshape $\langle$#1$\rangle$}} \newcommand*{\eps}{\varepsilon} \newcommand*{\CRANpkg}[1]{\href{http://CRAN.R-project.org/package=#1}{\pkg{#1}}} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} %% include your article here, just as usual %% Note that you should use the \pkg{}, \proglang{} and \code{} commands. % \section[About Java]{About \proglang{Java}} %% Note: If there is markup in \(sub)section, then it has to be escape as above. %% Note: These are explained in '?RweaveLatex' : <>= options(SweaveHooks= list(fig=function() par(mar=c(5.1, 4.1, 1.1, 2.1))), width = 75, digits = 7, # <-- here, keep R's default! prompt = "R> ", continue=" ") Sys.setenv(LANGUAGE = "en") if(.Platform$OS.type != "windows") Sys.setlocale("LC_MESSAGES","C") <>= if(nzchar(Sys.getenv("R_MM_PKG_CHECKING"))) print( .libPaths() ) stopifnot(require("sfsmisc")) @ \section[Introduction]{Introduction}% \small~\footnote{\mythanks}} %% - Why did I want this in R : There are situations, notably in researching better numerical algorithms for non-trivial mathematical functions, say the $F$-distribution function, where it is interesting and very useful to be able to rerun computations in \R\ in (potentially much) higher precision. For example, if you are interested in Euler's $e$, the base of natural logarithms, and given, e.g., by $e^x = \exp(x)$, you will look into <>= exp(1) @ which typically uses 7 digits for printing, as \code{getOption("digits")} is 7. To see \R's internal accuracy fully, you can use <>= print(exp(1), digits = 17) @ With \pkg{Rmpfr} you can now simply use ``mpfr -- numbers'' and get more accurate results automatically, here using a \emph{vector} of numbers as is customary in \R: <>= require("Rmpfr") # after having installed the package ... (one <- mpfr(1, 120)) exp(one) @ In combinatorics, number theory or when computing series, you may occasionally want to work with \emph{exact} factorials or binomial coefficients, where e.g. you may need all factorials $k!$, for $k=1,2,\dots,24$ or a full row of Pascal's triangle, i.e., want all $\binom{n}{k}$ for $n=80$. With \R's double precision, and standard printing precision <>= ns <- 1:24 ; factorial(ns) @ the full precision of $24!$ is clearly not printed. However, if you display it with more than its full internal precision, <>= noquote(sprintf("%-30.0f", factorial(24))) @ it is obviously wrong in the last couple of digits as they are known to be \code{0}. However, you can easily get full precision results with \pkg{Rmpfr}, by replacing ``simple'' numbers by mpfr-numbers: <>= ns <- mpfr(1:24, 120) ; factorial(ns) @ Or for the 80-th Pascal triangle row, $\binom{n}{k}$ for $n=80$ and $k=1,\dots,n$, <>= chooseMpfr.all(n = 80) <>= capture.and.write(# <- in package 'sfsmisc': ~/R/Pkgs/sfsmisc/R/misc-goodies.R <> , 5, 2, middle = 4, i.middle = 13) @ %%% "FIXME:" drawback of the above is that it is *integer* arithmetic only ... \paragraph{S4 classes and methods:} % Why they are useful here: S4 allows ``multiple dispatch'' which means that the method that is called for a generic function may not just depend on the first argument of the function (as in S3 or in traditional class-based OOP), but on a \emph{``signature''} of multiple arguments. For example, \texttt{a + b} is the same as \code{`+`(a,b)}, i.e., calling a function with two arguments. ... \subsection{The engine behind: MPFR and GMP} The package \pkg{Rmpfr} interfaces \R\ to the C (GNU) library \begin{quote} MPFR, acronym for ``\emph{\textbf{M}ultiple \textbf{P}recision \textbf{F}loating-Point \textbf{R}eliably}'' \end{quote} MPFR is Free Software, available under the LGPL license, %\nocite{ see \url{http://mpfr.org/} and \cite{FouLHLPZ:2007} and the standard reference to MPFR, \cite{FousseHLPZ-MPFR:2011}. %% MPFR itself is built on and requires the GNU Multiple Precision arithmetic library (GMP), see \url{http://gmplib.org/} and \cite{GMP:2011}. It can be obtained from there, or from your operating system vendor. On some platforms, it is very simple, to install MPFR and GMP, something necessary before \pkg{Rmpfr} can be used. E.g., in Linux distributions Debian, Ubuntu and other Debian derivatives, it is sufficient (for \emph{both} libraries) to simply issue \begin{verbatim} sudo apt-get install libmpfr-dev \end{verbatim} \section{Arithmetic with mpfr-numbers} <>= (0:7) / 7 # k/7, for k= 0..7 printed with R's default precision options(digits= 16) (0:7) / 7 # in full double precision accuracy options(digits= 7) # back to default str(.Machine[c("double.digits","double.eps", "double.neg.eps")], digits=10) 2^-(52:53) @ In other words, the double precision numbers \R\ uses have a 53-bit mantissa, and the two ``computer epsilons'' are $2^{-52}$ and $2^{-53}$, respectively. Less technically, how many decimal digits can double precision numbers work with, $2^{-53} = 10^{-x} \Longleftrightarrow x = 53 \log_{10}(2)$, <>= 53 * log10(2) @ i.e., almost 16 digits. If we want to compute some arithmetic expression with higher precision, this can now easily be achieved, using the \pkg{Rmpfr} package, by defining ``\texttt{mpfr}--numbers'' and then work with these. Starting with simple examples, a more precise version of $k/7$, $k = 0,\dots, 7$ from above: <>= x <- mpfr(0:7, 80)/7 # using 80 bits precision x 7*x 7*x - 0:7 @ which here is even ``perfect'' -- but that's ``luck'' only, and also the case here for ``simple'' double precision numbers, at least on our current platform.\footnote{64-bit Linux, Fedora 13 on a ``AMD Phenom 925'' processor} \subsection[Mathematical Constants, Pi, gamma, ..]{% Mathematical Constants, Pi ($\pi$), gamma, etc} Our \pkg{Rmpfr} package also provides the mathematical constants which MPFR provides, via \code{Const(., \Arg{prec})}, currently the \Sexpr{length(eval(formals(Const)[["name"]]))} constants <>= formals(Const)$name @ are available, where \code{"gamma"} is for Euler's gamma, $\gamma := \lim_{n\to\infty} \sum_{k=1}^n \frac 1 k - \log(n) \approx 0.5777$, and \code{"catalan"} for Catalan's constant (see \url{http://en.wikipedia.org/wiki/Catalan\%27s_constant}). <>= Const("pi") Const("log2") @ where you may note a default precision of 120 digits, a bit more than quadruple precision, but also that 1000 digits of $\pi$ are available instantaneously, <>= system.time(Pi <- Const("pi", 1000 *log2(10))) Pi @ As nice example of using Mpfr arithmetic: On a wintery Sunday, Hans Borchers desired to have an exact $\pi$ constant in \pkg{Rmpfr}, and realized that of course \code{mpfr(pi, 256)} could not be the solution, as \code{pi} is the double precision version of $\pi$ and hence only about 53 bit accurate (and the \code{mpfr()} cannot do magic, recognizing ``symbolic'' $\pi$). As he overlooked the \code{Const("pi", .)} solution above, he implemented the following function that computes pi applying Gauss' spectacular AGM-based (AGM := Arithmetic-Geometric Mean) approach [Borwein and Borwein (1987), \emph{Pi and the AGM}]; I have added a \code{verbose} argument, explicit iteration counting and slightly adapted the style to my own: <>= piMpfr <- function(prec=256, itermax = 100, verbose=TRUE) { m2 <- mpfr(2, prec) # '2' as mpfr number ## -> all derived numbers are mpfr (with precision 'prec') p <- m2 + sqrt(m2) # 2 + sqrt(2) = 3.414.. y <- sqrt(sqrt(m2)) # 2^ {1/4} x <- (y+1/y) / m2 it <- 0L repeat { p.old <- p it <- it+1L p <- p * (1+x) / (1+y) if(verbose) cat(sprintf("it=%2d, pi^ = %s, |.-.|/|.|=%e\n", it, formatMpfr(p, min(50, prec/log2(10))), 1-p.old/p)) if (abs(p-p.old) <= m2^(-prec)) break if(it > itermax) { warning("not converged in", it, "iterations") ; break } ## else s <- sqrt(x) y <- (y*s + 1/s) / (1+y) x <- (s+1/s)/2 } p } piMpfr()# indeed converges *quadratically* fast ## with relative error relErr <- 1 - piMpfr(256, verbose=FALSE) / Const("pi",260) ## in bits : asNumeric(-log2(abs(relErr))) @ \subsection[{seqMpfr()} for sequences:]{\code{seqMpfr()} for sequences:} In \R, arithmetic sequences are constructed by \code{seq()}, the ``sequence'' function, which is not generic, and with its many ways and possible arguments is convenient, but straightforward to automatically generalize for mpfr numbers. Instead, we provide the \code{seqMpfr} function... \subsection[Rounding, {roundMpfr()}, {asNumeric()} etc:]{% Rounding, \code{roundMpfr()}, \code{asNumeric()} etc:} In \R, the \code{round()} and \code{signif()} functions belong to the \code{Math2} group, and we provide \code{"mpfr"}-class methods for them: <>= getGroupMembers("Math2") showMethods("Math2", classes=c("mpfr", "mpfrArray")) @ For consistency reasons, however the resulting numbers keep the same number of precision bits, \code{precBits}: <>= i7 <- 1/mpfr(700, 100) c(i7, round(i7, digits = 6), signif(i7, digits = 6)) @ If you really want to ``truncate'' the precision to less digits or bits, you call \code{roundMpfr()}, <>= roundMpfr(i7, precBits = 30) roundMpfr(i7, precBits = 15) @ Note that 15 bits correspond to approximately $15 \cdot 0.3$, i.e., 4.5 digits, because $1/\log_2(10) \approx 0.30103\dots$. \paragraph{asNumeric():} Often used, e.g., to return to fast (\R-internal) arithmetic, also as alternative to \code{roundMpfr()} is to ``round to double precision'' producing standard \R numbers from ``mpfr'' numbers. We provide the function \code{asNumeric()}, a generic function with methods also for \code{"mpfrArray"} see below and the big integers and big rationals from package \pkg{gmp}, <>= showMethods(asNumeric) @ see, e.g., its use above. \paragraph{Formatting:} For explicit printing or plotting purposes, we provide an \code{"mpfr"} method for \R's \code{format()} function, also as explicit utility function \code{formatMpfr(x, digits)} which provides results to \code{digits} \emph{significant} digits, <>= cbind( sapply(1:7, function(d) format(i7, digits=d)) ) @ There, \code{digits = NULL} is the default where the help has (``always'') promised \emph{The default, \code{NULL}, uses enough digits to represent the full precision, often one or two digits more than you would expect}. However, for large numbers, say $10^{20000}$, e.g., \Sexpr{x <- mpfr(10,80)^20000}, all of \code{formatMpfr(x)}, \code{format(x)}, and \code{print(x)} (including ``auto-printing'' of \code{x}), have shown all digits \emph{before} the decimal point and not at all taken into account the 80-bit precision of \code{x} (which corresponds to only \code{80 / log2(10)} $\approx 24$ decimal digits). This has finally changed in the (typically default) case \code{formatMpfr(*, maybe.full = FALSE)}: <>= x <- mpfr(2, 80) ^ ((1:4)*10000) cbind(x) # -> show() -> print.mpfr() -> formatMpfr(.. , digits = NULL, maybe.full = FALSE) nchar(formatMpfr(x)) nchar(formatMpfr(x, maybe.full = TRUE)) @ \section{``All'' mathematical functions, arbitrarily precise} %% see ../../man/mfpr-class.Rd %% but also .... %% {Math}{\code{signature(x = "mpfr")}: All the S4 ``\texttt{Math}'' group functions are defined, using multiple precision (MPFR) arithmetic, i.e., <>= getGroupMembers("Math") @ % \code{{abs}}, \code{{sign}}, \code{{sqrt}}, % \code{{ceiling}}, \code{{floor}}, \code{{trunc}}, % \code{{cummax}}, \code{{cummin}}, \code{{cumprod}}, % \code{{cumsum}}, \code{{exp}}, \code{{expm1}}, % \code{{log}}, \code{{log10}}, \code{{log2}}, % \code{{log1p}}, \code{{cos}}, \code{{cosh}}, % \code{{sin}}, \code{{sinh}}, \code{{tan}}, % \code{{tanh}}, \code{{acos}}, \code{{acosh}}, % \code{{asin}}, \code{{asinh}}, \code{{atan}}, % \code{{atanh}}, \code{{gamma}}, \code{{lgamma}}, % \code{{digamma}}, and \code{{trigamma}}. where currently, \code{trigamma} is not provided by the MPFR library, and hence not implemented yet. %% cumsum(), cumprod() now work! \code{factorial()} has a \texttt{"mpfr"} method; and in addition, \code{factorialMpfr()} computes ${n!}$ efficiently in arbitrary precision, using the MPFR-internal implementation. This is mathematically (but not numerically) the same as $\Gamma(n+1) = $\code{gamma(n+1)}. Similarly to \code{factorialMpfr()}, but more generally useful,the functions \code{chooseMpfr(a,n)} and \code{pochMpfr(a,n)} compute (generalized!) binomial coefficients $\binom{a}{n}$ and ``the'' Pochhammer symbol or ``rising factorial'' \begin{eqnarray*} a^{(n)} &:=& a(a+1)(a+2)\cdots(a+n-1) \\ &=& \frac{(a+n-1)!}{(a-1)!} = \frac{\Gamma(a+n)}{\Gamma(a)}. \end{eqnarray*} Note that with this definition, \[ \binom{a}{n} \equiv \frac{a^{(n)}}{n!}. \] \section{Arbitrarily precise matrices and arrays} %%% FIXME --> ~/R/Meetings-Kurse-etc/2011-Warwick/1_MM_/Poster/MM-poster.tex The classes \code{"mpfrMatrix"} and \code{"mpfrArray"} correspond to the classical numerical \R\ \code{"matrix"} and \code{"array"} objects, which basically are arrays or vectors of numbers with a dimension \code{dim}, possibly named by \code{dimnames}. As there, they can be constructed by \code{dim(.) <- ..} setting, e.g., <>= head(x <- mpfr(0:7, 64)/7) ; mx <- x dim(mx) <- c(4,2) @ or by the \code{mpfrArray()} constructor, <>= dim(aa <- mpfrArray(1:24, precBits = 80, dim = 2:4)) <>= aa <>= capture.and.write(aa, 11, 4) @ and we can index and multiply such matrices, e.g., <>= mx[ 1:3, ] + c(1,10,100) crossprod(mx) @ and also \code{apply} functions, <>= apply(7 * mx, 2, sum) @ \section{Special mathematical functions} \code{zeta(x)} computes Riemann's Zeta function $\zeta(x)$ important in analytical number theory and related fields. The traditional definition is \begin{equation*} \zeta(x) = \sum_{n=1}^\infty \frac{1}{n^x}. \end{equation*} \code{Ei(x)} computes the \textbf{e}xponential integral, \begin{equation*} \int_{-\infty}^{x} \frac{e^t}{t} \; dt. \end{equation*} <>= curve(Ei, 0, 5, n=2001); abline(h=0,v=0, lty=3) @ \code{Li2(x)}, part of the MPFR C library since version 2.4.0, computes the dilogarithm, \begin{equation*} \mathtt{Li2(x)} = \operatorname{Li}_2(x) := \int_{0}^{x} \frac{-log(1-t)}{t} \; dt, \end{equation*} which is the most prominent ``polylogarithm'' function, where the general polylogarithm is (initially) defined as \begin{equation*} \operatorname{Li}_s(z) = \sum_{k=1}^\infty \frac{z^k}{k^s}, \ \forall s \in \mathbb{C} \ \ \forall |z| < 1, z\in\mathbb{C}, \end{equation*} see \url{http://en.wikipedia.org/wiki/Polylogarithm#Dilogarithm}. Note that the integral definition is valid for all $x\in \mathbb{C}$, and also, $Li_2(1) = \zeta(2) = \pi^2/6$. <>= if(mpfrVersion() >= "2.4.0") ## Li2() is not available in older MPFR versions all.equal(Li2(1), Const("pi", 128)^2/6, tol = 1e-30) @ where we also see that \pkg{Rmpfr} provides \texttt{all.equal()} methods for mpfr-numbers which naturally allow very small tolerances \code{tol}. <>= if(mpfrVersion() >= "2.4.0") curve(Li2, -2, 13, n=2000); abline(h=0,v=0, lty=3) @ \code{erf(x)} is the ``error\footnote{named exactly because of its relation to the normal / Gaussian distribution} function'' and \code{erfc(x)} its \textbf{c}omplement, \code{erfc(x) := 1 - erf(x)}, defined as \begin{equation*} \operatorname{erf}(x) = \frac{2}{\sqrt{\pi}}\int_{0}^x e^{-t^2} dt, \end{equation*} and consequently, both functions simply are reparametrizations of the cumulative normal, $\Phi(x) = \int_{-\infty}^x \phi(t)\;dt = $\code{pnorm(x)} where $\phi$ is the normal density function $\phi(t) := \frac{1}{\sqrt{2\pi}}e^{-t^2}$=\code{dnorm(x)}. Namely, \code{erf(x) = 2*pnorm(sqrt(2)*x)} and \code{erfc(x) = 1 - erf(x) = 2* pnorm(sqrt(2)*x, lower=FALSE)}. <>= curve(erf, -3,3, col = "red", ylim = c(-1,2)) curve(erfc, add = TRUE, col = "blue") abline(h=0, v=0, lty=3); abline(v=c(-1,1), lty=3, lwd=.8, col="gray") legend(-3,1, c("erf(x)", "erfc(x)"), col = c("red","blue"), lty=1) @ \subsection{Applications} The CRAN package \CRANpkg{Bessel} provides asymptotic formulas for Bessel functions also of \emph{fractional} order which do work for \code{mpfr}-vector arguments as well. \section{Integration highly precisely} Sometimes, important functions are defined as integrals of other known functions, e.g., the dilogarithm $\operatorname{Li}_2()$ above. Consequently, we found it desirable to allow numerical integration, using mpfr-numbers, and hence---conceptionally---arbitrarily precisely. \R's \code{integrate()} uses a relatively smart adaptive integration scheme, but based on C code which is not very simply translatable to pure \R, to be used with mpfr numbers. For this reason, our \code{integrateR()} function uses classical Romberg integration \citep{Bauer-1961}. We demonstrate its use, first by looking at a situation where \R's \code{integrate()} can get problems: <>= integrateR(dnorm,0,2000) integrateR(dnorm,0,2000, rel.tol=1e-15) integrateR(dnorm,0,2000, rel.tol=1e-15, verbose=TRUE) @ Now, for situations where numerical integration would not be necessary, as the solution is known analytically, but hence are useful for exploration of high accuracy numerical integration: First, the exponential function $\exp(x) = e^x$ with its well-known $\int \exp(t)\;dt = \exp(x)$, both with standard (double precision) floats, <>= (Ie.d <- integrateR(exp, 0 , 1, rel.tol=1e-15, verbose=TRUE)) @ and then the same, using 200-bit accurate mpfr-numbers: <>= (Ie.m <- integrateR(exp, mpfr(0,200), 1, rel.tol=1e-25, verbose=TRUE)) (I.true <- exp(mpfr(1, 200)) - 1) ## with absolute errors as.numeric(c(I.true - Ie.d$value, I.true - Ie.m$value)) @ Now, for polynomials, where Romberg integration of the appropriate order is exact, mathematically, <>= if(require("polynom")) { x <- polynomial(0:1) p <- (x-2)^4 - 3*(x-3)^2 Fp <- as.function(p) print(pI <- integral(p)) # formally print(Itrue <- predict(pI, 5) - predict(pI, 0)) ## == 20 } else { Fp <- function(x) (x-2)^4 - 3*(x-3)^2 Itrue <- 20 } (Id <- integrateR(Fp, 0, 5)) (Im <- integrateR(Fp, 0, mpfr(5, 256), rel.tol = 1e-70, verbose=TRUE)) ## and the numerical errors, are indeed of the expected size: 256 * log10(2) # - expect ~ 77 digit accuracy for mpfr(*., 256) as.numeric(Itrue - c(Im$value, Id$value)) @ \section{Conclusion} The \R\ package \pkg{Rmpfr}, available from CRAN since August 2009, provides the possibility to run many computations in R with (arbitrarily) high accuracy, though typically with substantial speed penalty. This is particularly important and useful for checking and exploring the numerical stability and appropriateness of mathematical formulae that are translated to a computer language like \R, often without very careful consideration of the limits of computer arithmetic. \bibliography{Rmpfr,log1mexp} FIXME: \textbf{Index} of all functions mentioned \dots \end{document} Rmpfr/inst/doc/Maechler_useR_2011-abstr.R0000644000175000017500000000164214136173510017635 0ustar nileshnilesh### R code from vignette source 'Maechler_useR_2011-abstr.Rnw' ################################################### ### code chunk number 1: preliminaries ################################################### options(SweaveHooks= list(fig=function() par(mar=c(5.1, 4.1, 1.1, 2.1))), width = 75) Sys.setenv(LANGUAGE = "en") if(.Platform$OS.type != "windows") Sys.setlocale("LC_MESSAGES","C") stopifnot(require("Rmpfr")) ################################################### ### code chunk number 2: ex-exp ################################################### options(digits = 17)# to print to full "standard R" precision .N <- function(.) mpfr(., precBits = 200) exp( 1 ) exp(.N(1)) ################################################### ### code chunk number 3: nice-but-does-not-fit-on-1-page (eval = FALSE) ################################################### ## choose ( 200, 99:100 ) ## chooseMpfr( 200, 99:100 ) Rmpfr/inst/doc/log1mexp-note.R0000644000175000017500000003075614136173545016062 0ustar nileshnilesh### R code from vignette source 'log1mexp-note.Rnw' ################################################### ### code chunk number 1: preliminaries ################################################### ## Our custom graphics device: pdfaCrop <- function(name, width, height, ...) { fn <- paste(name, "pdf", sep = ".") if(FALSE)## debug cat("pdfaCrop: fn = ",fn,"; call:\n\t",deparse(match.call()),"\n") grDevices::pdf(fn, width = width, height = height, onefile=FALSE)# ...) assign(".pdfaCrop.name", fn, envir = globalenv()) } ## This is used automagically : pdfaCrop.off <- function() { dev.off()# for the pdf f <- get(".pdfaCrop.name", envir = globalenv()) ## and now crop that file: pdfcrop <- "pdfcrop" # relying on PATH - fix if needed pdftex <- "pdftex" # relying on PATH - fix if needed system(paste(pdfcrop, "--pdftexcmd", pdftex, f, f, "1>/dev/null 2>&1"), intern=FALSE) } op.orig <- options(width = 75, SweaveHooks= list(fig=function() par(mar=c(5.1, 4.1, 1.1, 2.1))), digits = 5, useFancyQuotes = "TeX", ## for JSS, but otherwise MM does not like it: ## prompt="R> ", continue=" ")# 2 (or 3) blanks: use same length as 'prompt' if((p <- "package:fortunes") %in% search()) try(detach(p, unload=TRUE, char=TRUE)) Sys.setenv(LANGUAGE = "en") if(.Platform$OS.type != "windows") Sys.setlocale("LC_MESSAGES","C") if(getRversion() < "2.15") paste0 <- function(...) paste(..., sep = '') library("sfsmisc")# e.g., for eaxis() library("Rmpfr") .plot.BC <- FALSE # no Box-Cox plot ################################################### ### code chunk number 2: def-t3 ################################################### library(Rmpfr) t3.l1e <- function(a) { c(def = log(1 - exp(-a)), expm1 = log( -expm1(-a)), log1p = log1p(-exp(-a))) } ################################################### ### code chunk number 3: def-leg ################################################### leg <- local({ r <- body(t3.l1e)[[2]]; r[[1]] <- `expression`; eval(r) }) ## will be used below ################################################### ### code chunk number 4: def-test-2 (eval = FALSE) ################################################### ## ##' The relative Error of log1mexp computations: ## relE.l1e <- function(a, precBits = 1024) { ## stopifnot(is.numeric(a), length(a) == 1, precBits > 50) ## da <- t3.l1e(a) ## double precision ## a. <- mpfr(a, precBits=precBits) ## ## high precision *and* using the correct case: ## mMa <- if(a <= log(2)) log(-expm1(-a.)) else log1p(-exp(-a.)) ## structure(as.numeric(1 - da/mMa), names = names(da)) ## } ################################################### ### code chunk number 5: def-test-funs ################################################### library(Rmpfr) t3.l1e <- function(a) { c(def = log(1 - exp(-a)), expm1 = log( -expm1(-a)), log1p = log1p(-exp(-a))) } ##' The relative Error of log1mexp computations: relE.l1e <- function(a, precBits = 1024) { stopifnot(is.numeric(a), length(a) == 1, precBits > 50) da <- t3.l1e(a) ## double precision a. <- mpfr(a, precBits=precBits) ## high precision *and* using the correct case: mMa <- if(a <= log(2)) log(-expm1(-a.)) else log1p(-exp(-a.)) structure(as.numeric(1 - da/mMa), names = names(da)) } ################################################### ### code chunk number 6: comp-big (eval = FALSE) ################################################### ## a.s <- 2^seq(-55, 10, length = 256) ## ra.s <- t(sapply(a.s, relE.l1e)) ################################################### ### code chunk number 7: bigpic-show (eval = FALSE) ################################################### ## a.s <- 2^seq(-55, 10, length = 256) ## ra.s <- t(sapply(a.s, relE.l1e)) ## cbind(a.s, ra.s) # comparison of the three approaches ################################################### ### code chunk number 8: bigpic-do ################################################### a.s <- 2^seq(-55, 10, length = 256) ra.s <- t(sapply(a.s, relE.l1e)) capture.and.write(cbind(a.s, ra.s), 8, last = 6) ################################################### ### code chunk number 9: drop-large-a ################################################### ii <- a.s < 710 a.s <- a.s[ii] ra.s <- ra.s[ii, ] ################################################### ### code chunk number 10: a.small ################################################### t3.l1e(1e-20) as.numeric(t3.l1e(mpfr(1e-20, 256))) ################################################### ### code chunk number 11: bigpict-setup (eval = FALSE) ################################################### ## par(mar = c(4.1,4.1,0.6,1.6)) ## cc <- adjustcolor(c(4,1,2),.8, red.f=.7) ## lt <- c("solid","33","3262") ## ll <- c(.7, 1.5, 2) ################################################### ### code chunk number 12: bigpict-def (eval = FALSE) ################################################### ## matplot(a.s, abs(ra.s), type = "l", log = "xy", ## col=cc, lty=lt, lwd=ll, xlab = "a", ylab = "", axes=FALSE) ## legend("top", leg, col=cc, lty=lt, lwd=ll, bty="n") ## draw.machEps <- function(alpha.f = 1/3, col = adjustcolor("black", alpha.f)) { ## abline(h = .Machine$double.eps, col=col, lty=3) ## axis(4, at=.Machine$double.eps, label=quote(epsilon[c]), las=1, col.axis=col) ## } ## eaxis(1); eaxis(2); draw.machEps(0.4) ################################################### ### code chunk number 13: zoomin-comp ################################################### a. <- (1:400)/256 ra <- t(sapply(a., relE.l1e)) ra2 <- ra[,-1] ################################################### ### code chunk number 14: bigpict-fig ################################################### getOption("SweaveHooks")[["fig"]]() par(mar = c(4.1,4.1,0.6,1.6)) cc <- adjustcolor(c(4,1,2),.8, red.f=.7) lt <- c("solid","33","3262") ll <- c(.7, 1.5, 2) matplot(a.s, abs(ra.s), type = "l", log = "xy", col=cc, lty=lt, lwd=ll, xlab = "a", ylab = "", axes=FALSE) legend("top", leg, col=cc, lty=lt, lwd=ll, bty="n") draw.machEps <- function(alpha.f = 1/3, col = adjustcolor("black", alpha.f)) { abline(h = .Machine$double.eps, col=col, lty=3) axis(4, at=.Machine$double.eps, label=quote(epsilon[c]), las=1, col.axis=col) } eaxis(1); eaxis(2); draw.machEps(0.4) ## draw the zoom-in region into the plot: yl <- range(pmax(1e-18, abs(ra2))) rect(min(a.), yl[1], max(a.), yl[2], col= adjustcolor("black", .05), border="gray", pch = 5) ################################################### ### code chunk number 15: zoomin-show (eval = FALSE) ################################################### ## a. <- (1:400)/256 ## ra <- t(sapply(a., relE.l1e)) ## ra2 <- ra[,-1] ################################################### ### code chunk number 16: boxcox ################################################### da <- cbind(a = a., as.data.frame(ra2)) library(MASS) bc1 <- boxcox(abs(expm1) ~ a, data = da, lambda = seq(0,1, by=.01), plotit=.plot.BC) bc2 <- boxcox(abs(log1p) ~ a, data = da, lambda = seq(0,1, by=.01), plotit=.plot.BC) c(with(bc1, x[which.max(y)]), with(bc2, x[which.max(y)]))## optimal powers ## ==> taking ^ (1/3) : s1 <- with(da, smooth.spline(a, abs(expm1)^(1/3), df = 9)) s2 <- with(da, smooth.spline(a, abs(log1p)^(1/3), df = 9)) ################################################### ### code chunk number 17: zoom-in-def-1 (eval = FALSE) ################################################### ## matplot(a., abs(ra2), type = "l", log = "y", # ylim = c(-1,1)*1e-12, ## col=cc[-1], lwd=ll[-1], lty=lt[-1], ## ylim = yl, xlab = "a", ylab = "", axes=FALSE) ## legend("topright", leg[-1], col=cc[-1], lwd=ll[-1], lty=lt[-1], bty="n") ## eaxis(1); eaxis(2); draw.machEps() ## lines(a., predict(s1)$y ^ 3, col=cc[2], lwd=2) ## lines(a., predict(s2)$y ^ 3, col=cc[3], lwd=2) ################################################### ### code chunk number 18: zoom-in-fig ################################################### getOption("SweaveHooks")[["fig"]]() cl2 <- adjustcolor("slateblue", 1/2)# (adj: lwd=3) # the color for "log(2)" par(mar = c(4.1,4.1,0.6,1.6)) matplot(a., abs(ra2), type = "l", log = "y", # ylim = c(-1,1)*1e-12, col=cc[-1], lwd=ll[-1], lty=lt[-1], ylim = yl, xlab = "a", ylab = "", axes=FALSE) legend("topright", leg[-1], col=cc[-1], lwd=ll[-1], lty=lt[-1], bty="n") eaxis(1); eaxis(2); draw.machEps() lines(a., predict(s1)$y ^ 3, col=cc[2], lwd=2) lines(a., predict(s2)$y ^ 3, col=cc[3], lwd=2) abline(v = log(2), col=cl2, lty="9273", lwd=2.5) cl2. <- adjustcolor(cl2, 2) axis(1, at=log(2), label=quote(a[0] == log~2), las=1, col.axis=cl2.,col=cl2, lty="9273", lwd=2.5) ## what system is it ? sysInf <- Sys.info()[c("sysname", "release", "nodename", "machine")] mtext(with(as.list(sysInf), paste0(sysname," ",release,"(",substr(nodename,1,16),") -- ", machine)), side=1, adj=1, line=2.25, cex = 3/4) ################################################### ### code chunk number 19: uniroot-x1 ################################################### ## Find x0, such that exp(x) =.= g(x) for x < x0 : f0 <- function(x) { x <- exp(x) - log1p(exp(x)) x[x==0] <- -1 ; x } u0 <- uniroot(f0, c(-100, 0), tol=1e-13) str(u0, digits=10) x0 <- u0[["root"]] ## -36.39022698 --- note that ~= \log(\eps_C) all.equal(x0, -52.5 * log(2), tol=1e-13) ## Find x1, such that x + exp(-x) =.= g(x) for x > x1 : f1 <- function(x) { x <- (x + exp(-x)) - log1p(exp(x)) x[x==0] <- -1 ; x } u1 <- uniroot(f1, c(1, 20), tol=1e-13) str(u1, digits=10) x1 <- u1[["root"]] ## 16.408226 ## Find x2, such that x =.= g(x) for x > x2 : f2 <- function(x) { x <- log1p(exp(x)) - x ; x[x==0] <- -1 ; x } u2 <- uniroot(f2, c(5, 50), tol=1e-13) str(u2, digits=10) x2 <- u2[["root"]] ## 33.27835 ################################################### ### code chunk number 20: log1pexp-plot ################################################### getOption("SweaveHooks")[["fig"]]() par(mfcol= 1:2, mar = c(4.1,4.1,0.6,1.6), mgp = c(1.6, 0.75, 0)) curve(x+exp(-x) - log1p(exp(x)), 15, 25, n=2^11); abline(v=x1, lty=3) curve(log1p(exp(x)) - x, 33.1, 33.5, n=2^10); abline(v=x2, lty=3) ################################################### ### code chunk number 21: def-test-pfuns ################################################### t4p.l1e <- function(x) { c(def = log(1 + exp(x)), log1p = log1p(exp(x)), ## xlog1p = x + log1p(exp(-x)), xpexp = x + exp(-x), x = x) } leg <- local({ r <- body(t4p.l1e)[[2]]; r[[1]] <- `expression`; eval(r) }) ##' The relative Error of log1pexp computations: relE.pl1e <- function(x, precBits = 1024) { stopifnot(is.numeric(x), length(x) == 1, precBits > 50) dx <- t4p.l1e(x) ## double precision x. <- mpfr(x, precBits=precBits) ## high precision *and* using the correct case: mMx <- if(x < 0) log1p(exp(x.)) else x. + log1p(exp(-x.)) structure(as.numeric(1 - dx/mMx), names = names(dx)) } ################################################### ### code chunk number 22: comp-big ################################################### x.s <- seq(-100, 750, by = 5) # <- the big picture ==> problem for default x.s <- seq( 5, 60, length=512) # <- the zoom in ==> *no* problem for def. rx.s <- t(sapply(x.s, relE.pl1e)) signif(cbind(x.s, rx.s),3) ################################################### ### code chunk number 23: bigpict-2-fig ################################################### getOption("SweaveHooks")[["fig"]]() par(mar = c(4.1,4.1,0.6,1.6), mgp = c(1.6, 0.75, 0)) cc <- adjustcolor(c(4,1,2,3),.8, red.f=.7, blue.f=.8) lt <- c("solid","33","3262","dotdash") ll <- c(.7, 1.5, 2, 2) ym <- 1e-18 yM <- 1e-13 matplot(x.s, pmax(pmin(abs(rx.s),yM),ym), type = "l", log = "y", axes=FALSE, ylim = c(ym,yM), col=cc, lty=lt, lwd=ll, xlab = "x", ylab = "") legend("topright", leg, col=cc, lty=lt, lwd=ll, bty="n") eaxis(1, at=pretty(range(x.s), n =12)); eaxis(2) draw.machEps(0.4) x12 <- c(18, 33.3) abline(v=x12, col=(ct <- adjustcolor("brown", 0.6)), lty=3) axis(1, at=x12, labels=formatC(x12), padj = -3.2, hadj = -.1, tcl = +.8, col=ct, col.axis=ct, col.ticks=ct) ################################################### ### code chunk number 24: exp-overflow ################################################### (eMax <- .Machine$double.max.exp * log(2)) exp(eMax * c(1, 1+1e-15)) ################################################### ### code chunk number 25: sessionInfo ################################################### toLatex(sessionInfo(), locale=FALSE) ################################################### ### code chunk number 26: finalizing ################################################### options(op.orig) Rmpfr/inst/doc/Rmpfr-pkg.R0000644000175000017500000002321114136173526015213 0ustar nileshnilesh### R code from vignette source 'Rmpfr-pkg.Rnw' ################################################### ### code chunk number 1: preliminaries ################################################### options(SweaveHooks= list(fig=function() par(mar=c(5.1, 4.1, 1.1, 2.1))), width = 75, digits = 7, # <-- here, keep R's default! prompt = "R> ", continue=" ") Sys.setenv(LANGUAGE = "en") if(.Platform$OS.type != "windows") Sys.setlocale("LC_MESSAGES","C") ################################################### ### code chunk number 2: diagnose-lib ################################################### if(nzchar(Sys.getenv("R_MM_PKG_CHECKING"))) print( .libPaths() ) stopifnot(require("sfsmisc")) ################################################### ### code chunk number 3: exp-1 ################################################### exp(1) ################################################### ### code chunk number 4: exp-1-dig-17 ################################################### print(exp(1), digits = 17) ################################################### ### code chunk number 5: exp-1-mp ################################################### require("Rmpfr") # after having installed the package ... (one <- mpfr(1, 120)) exp(one) ################################################### ### code chunk number 6: factorial-1 ################################################### ns <- 1:24 ; factorial(ns) ################################################### ### code chunk number 7: factorial-full ################################################### noquote(sprintf("%-30.0f", factorial(24))) ################################################### ### code chunk number 8: factorial-mpfr ################################################### ns <- mpfr(1:24, 120) ; factorial(ns) ################################################### ### code chunk number 9: chooseM-ex-fake (eval = FALSE) ################################################### ## chooseMpfr.all(n = 80) ################################################### ### code chunk number 10: chooseM-run ################################################### capture.and.write(# <- in package 'sfsmisc': ~/R/Pkgs/sfsmisc/R/misc-goodies.R chooseMpfr.all(n = 80) , 5, 2, middle = 4, i.middle = 13) ################################################### ### code chunk number 11: ex1 ################################################### (0:7) / 7 # k/7, for k= 0..7 printed with R's default precision options(digits= 16) (0:7) / 7 # in full double precision accuracy options(digits= 7) # back to default str(.Machine[c("double.digits","double.eps", "double.neg.eps")], digits=10) 2^-(52:53) ################################################### ### code chunk number 12: n-digs ################################################### 53 * log10(2) ################################################### ### code chunk number 13: ex1 ################################################### x <- mpfr(0:7, 80)/7 # using 80 bits precision x 7*x 7*x - 0:7 ################################################### ### code chunk number 14: Const-names ################################################### formals(Const)$name ################################################### ### code chunk number 15: Const-ex ################################################### Const("pi") Const("log2") ################################################### ### code chunk number 16: pi-1000 ################################################### system.time(Pi <- Const("pi", 1000 *log2(10))) Pi ################################################### ### code chunk number 17: pi-fn-Gauss-HB ################################################### piMpfr <- function(prec=256, itermax = 100, verbose=TRUE) { m2 <- mpfr(2, prec) # '2' as mpfr number ## -> all derived numbers are mpfr (with precision 'prec') p <- m2 + sqrt(m2) # 2 + sqrt(2) = 3.414.. y <- sqrt(sqrt(m2)) # 2^ {1/4} x <- (y+1/y) / m2 it <- 0L repeat { p.old <- p it <- it+1L p <- p * (1+x) / (1+y) if(verbose) cat(sprintf("it=%2d, pi^ = %s, |.-.|/|.|=%e\n", it, formatMpfr(p, min(50, prec/log2(10))), 1-p.old/p)) if (abs(p-p.old) <= m2^(-prec)) break if(it > itermax) { warning("not converged in", it, "iterations") ; break } ## else s <- sqrt(x) y <- (y*s + 1/s) / (1+y) x <- (s+1/s)/2 } p } piMpfr()# indeed converges *quadratically* fast ## with relative error relErr <- 1 - piMpfr(256, verbose=FALSE) / Const("pi",260) ## in bits : asNumeric(-log2(abs(relErr))) ################################################### ### code chunk number 18: Math2-def ################################################### getGroupMembers("Math2") showMethods("Math2", classes=c("mpfr", "mpfrArray")) ################################################### ### code chunk number 19: round-ex ################################################### i7 <- 1/mpfr(700, 100) c(i7, round(i7, digits = 6), signif(i7, digits = 6)) ################################################### ### code chunk number 20: roundMpfr-ex ################################################### roundMpfr(i7, precBits = 30) roundMpfr(i7, precBits = 15) ################################################### ### code chunk number 21: asNumeric-meth ################################################### showMethods(asNumeric) ################################################### ### code chunk number 22: format-ex ################################################### cbind( sapply(1:7, function(d) format(i7, digits=d)) ) ################################################### ### code chunk number 23: format-lrg ################################################### x <- mpfr(2, 80) ^ ((1:4)*10000) cbind(x) # -> show() -> print.mpfr() -> formatMpfr(.. , digits = NULL, maybe.full = FALSE) nchar(formatMpfr(x)) nchar(formatMpfr(x, maybe.full = TRUE)) ################################################### ### code chunk number 24: Math-group ################################################### getGroupMembers("Math") ################################################### ### code chunk number 25: Matrix-ex ################################################### head(x <- mpfr(0:7, 64)/7) ; mx <- x dim(mx) <- c(4,2) ################################################### ### code chunk number 26: mpfrArr-ex ################################################### dim(aa <- mpfrArray(1:24, precBits = 80, dim = 2:4)) ################################################### ### code chunk number 27: pr-mpfrArr-fake (eval = FALSE) ################################################### ## aa ################################################### ### code chunk number 28: pr-mpfrArr-do ################################################### capture.and.write(aa, 11, 4) ################################################### ### code chunk number 29: crossprod ################################################### mx[ 1:3, ] + c(1,10,100) crossprod(mx) ################################################### ### code chunk number 30: apply-mat ################################################### apply(7 * mx, 2, sum) ################################################### ### code chunk number 31: Ei-curve ################################################### getOption("SweaveHooks")[["fig"]]() curve(Ei, 0, 5, n=2001); abline(h=0,v=0, lty=3) ################################################### ### code chunk number 32: Li2-1 ################################################### if(mpfrVersion() >= "2.4.0") ## Li2() is not available in older MPFR versions all.equal(Li2(1), Const("pi", 128)^2/6, tol = 1e-30) ################################################### ### code chunk number 33: Li2-curve ################################################### getOption("SweaveHooks")[["fig"]]() if(mpfrVersion() >= "2.4.0") curve(Li2, -2, 13, n=2000); abline(h=0,v=0, lty=3) ################################################### ### code chunk number 34: erf-curves ################################################### getOption("SweaveHooks")[["fig"]]() curve(erf, -3,3, col = "red", ylim = c(-1,2)) curve(erfc, add = TRUE, col = "blue") abline(h=0, v=0, lty=3); abline(v=c(-1,1), lty=3, lwd=.8, col="gray") legend(-3,1, c("erf(x)", "erfc(x)"), col = c("red","blue"), lty=1) ################################################### ### code chunk number 35: integrateR-dnorm ################################################### integrateR(dnorm,0,2000) integrateR(dnorm,0,2000, rel.tol=1e-15) integrateR(dnorm,0,2000, rel.tol=1e-15, verbose=TRUE) ################################################### ### code chunk number 36: integ-exp-double ################################################### (Ie.d <- integrateR(exp, 0 , 1, rel.tol=1e-15, verbose=TRUE)) ################################################### ### code chunk number 37: integ-exp-mpfr ################################################### (Ie.m <- integrateR(exp, mpfr(0,200), 1, rel.tol=1e-25, verbose=TRUE)) (I.true <- exp(mpfr(1, 200)) - 1) ## with absolute errors as.numeric(c(I.true - Ie.d$value, I.true - Ie.m$value)) ################################################### ### code chunk number 38: integ-poly-double ################################################### if(require("polynom")) { x <- polynomial(0:1) p <- (x-2)^4 - 3*(x-3)^2 Fp <- as.function(p) print(pI <- integral(p)) # formally print(Itrue <- predict(pI, 5) - predict(pI, 0)) ## == 20 } else { Fp <- function(x) (x-2)^4 - 3*(x-3)^2 Itrue <- 20 } (Id <- integrateR(Fp, 0, 5)) (Im <- integrateR(Fp, 0, mpfr(5, 256), rel.tol = 1e-70, verbose=TRUE)) ## and the numerical errors, are indeed of the expected size: 256 * log10(2) # - expect ~ 77 digit accuracy for mpfr(*., 256) as.numeric(Itrue - c(Im$value, Id$value)) Rmpfr/cleanup0000755000175000017500000000010114136173547013052 0ustar nileshnilesh#! /bin/sh rm -f src/Makevars # as we create it from Makevars.in Rmpfr/NAMESPACE0000644000175000017500000001554514107223103012714 0ustar nileshnileshuseDynLib(Rmpfr, .registration=TRUE) ##-- From 'gmp' (on which we 'Depend' ------------------------------------------ ## The user can and typically should just use mpfr() or mpfr() export(.mpfr2bigz, .bigz2mpfr, .bigq2mpfr, ## e.g., for use in gmp :: Math.bigz & Math.bigq : ..bigz2mpfr, ..bigq2mpfr) ## Import all we need, but not more importMethodsFrom("methods" ## as we define methods for them: , coerce, "coerce<-", show , Arith, Compare, Logic, Math, Math2, Ops, Summary ) importFrom("methods", as, "as<-", callGeneric, callNextMethod, is, extends, new, validObject, setClass, setClassUnion, setMethod, setOldClass, setValidity, slot, "slot<-", .slotNames, getDataPart, setDataPart, getClass, getClassDef, signature, representation, prototype ## needed implicitly [or "bug" ..]: , loadMethod) importFrom("utils", str) importFrom("stats" # import *and* rename -- we extend these : ,stats__pnorm = pnorm ,stats__dnorm = dnorm ,stats__dpois = dpois ,stats__dbinom = dbinom ,stats__dgamma = dgamma ,stats__dnbinom = dnbinom ,stats__dt = dt ) importClassesFrom("gmp", "bigz", "bigq") importFrom("gmp" , asNumeric, as.bigz, as.bigq, .as.char.bigz, ..as.bigz , apply # , apply.default # *.default: else apply() breaks in pkg SNscan , crossprod, tcrossprod# <- as we write (S4) methods for those (*not* '%*%' !) , matrix, numerator, denominator, frexpZ, chooseZ , is.whole, formatN # because we add own S3 methods ) if(packageVersion("gmp") >= "0.5.8") importFrom("gmp", is.matrixZQ, #-> R/gmp-convert.R which.min, which.max)# the generics if(packageVersion("gmp") >= "0.6-1") importFrom("gmp", c_bigz, c_bigq)# for sapply() like usage ##------------------------------------------------------------------------------ exportClasses("mpfr1", "mpfr" , "mpfrArray" , "mpfrMatrix" , "summaryMpfr" # mainly for printing , "atomicVector" , "array_or_vector" , "Mnumber" ## new, *not* containing "matrix" (which has -> "character"!): , "numericVector" , "mNumber" ) ## Standard (base, stats) functions which we made into S4 generics export(mean, median, quantile) export(.mpfr, .mpfr. ## ".Arith.codes" ## , ".Arith.mpfr.num" ## , ".Arith.num.mpfr" ## , ".Compare.codes" ## , ".Compare.codesRev" ## , ".Compare.mpfr.num" ## , ".Compare.num.mpfr" ## , ".Math.codes" ## , ".Math.gen" ## , ".Summary.codes" ## , ".abs.mpfr" ## , ".dimCheck" , .getPrec , .getSign , .mpfr_erange, .mpfr_erange_set, .mpfr_erange_kinds, .mpfr_erange_is_int , .mpfr_maxPrec, .mpfr_minPrec ## , ".mA.subAssign" ## , ".matmult.R" ## , ".mpfr_debug" , ".mpfr_negative" ## , ".mpfr_negativeR" ## , ".mpfr_repl" , ".mpfr_sign" ## , ".mpfr_subset" , ".mpfr2str" , .mpfr_formatinfo , .mpfr2exp ## , ".mpfrA.subset" , .mpfrVersion, .mpfr_gmp_numbbits , .mpfr2list, mpfrImport, mpfrXport # <- experimental: for a possible save format ## , ".packageName" ## , ".print.mpfr" ## , ".requireCachedGenerics" , "Ai" , "Bernoulli" , "Const" , "Ei" , "Li2" , "all.equal" , "aperm" , "apply" ## <- we make it S4 generic , "atan2" , "beta", "lbeta" ## S3 "c.mpfr" , "chooseMpfr", "chooseMpfr.all", "sumBinomMpfr" , "dbinom", "dpois", "dnorm", "dgamma" , "dnbinom" , dt , "erf", "erfc" , "factorial" , "factorialMpfr" , "format" , formatMpfr, formatBin, formatDec, formatHex , frexpMpfr, ldexpMpfr , "getD" , "getPrec" , "hypot" , igamma # working iff MPFR version >= 3.2.0 >>> R/special-fun.R <<< , "integrateR" , is.mpfr , "j0" , "j1" , "jn" , log1mexp, log1pexp , matmult , "mpfr" , mpfrIs0, .mpfr.is.whole # as substitutes of , "mpfr.is.0", "mpfr.is.integer" # <-- now (Aug. 2015) deprecated , "mpfr2array", "mpfrArray" , "mpfrVersion" , "mpfr_default_prec" , "optimizeR" , outer # <- our own instead of base, so it uses tcrossprod() methods , "hjkMpfr" ## <-- FIXME, rather part of an optimR(...., method = "hjk") , "pbetaI" , "pmax", "pmin" , "pnorm" , "pochMpfr" , "roundMpfr" , sapplyMpfr , "seqMpfr" , "t" , "toNum" , "unique" , "unirootR" , "y0", "y1", "yn" , "zeta" ) exportMethods(##___ "own generics" ___ "apply" # <- we made it into S4 generic (with "ANY" method = S3 generic from gmp!) , "asNumeric" ##___ "other generics" ___ ## Group Methods , Arith, Compare, Logic, Math, Math2, Ops, Summary , "abs", "log", "sign" , "Re", "Im", "Mod", "Arg", "Conj" , "all.equal", "aperm" , "as.vector", "as.integer", "as.numeric" , "coerce", "coerce<-" , "cbind", "rbind" , "diag", "diag<-" , "dim", "dim<-", "dimnames", "dimnames<-" , "atan2", "beta", "lbeta" , "factorial" , "is.finite", "is.infinite", "is.na", "is.nan" , "%*%", "crossprod", "tcrossprod", "t" , "format" , "mean", "pmax", "pmin" , "show", "unique" , "colSums", "colMeans" , "rowSums", "rowMeans", "norm" , summary , head, tail , "which.min", "which.max" ) ## Our own S3 generic mpfr(): S3method(mpfr, default) S3method(mpfr, bigz) S3method(mpfr, bigq) S3method(mpfr, mpfr) S3method(mpfr, NULL) S3method(mpfr, Ncharacter) ## needed because gmp "forgets" to S3method() these: ## (and so things only work, when gmp / Rmpfr is attached): ## S3method(apply, default) ## S3method(apply, bigz) ## S3method(apply, bigq) S3method(c, mpfr) S3method(as.array, mpfr) S3method(as.matrix, mpfr) ## Would break the working of vapply(, FUN) e.g. in pbetaI(): ## S3method(as.list, mpfr1) ## S3method(as.list, mpfr) S3method(determinant, mpfrMatrix) S3method(scale, mpfrMatrix) S3method(diff, mpfr) S3method(str, mpfr) S3method(is.whole, mpfr) #S3method(is.whole, mpfrArray) S3method(formatN, mpfr) S3method(print, mpfr) S3method(print, mpfr1) S3method(print, mpfrArray) S3method(print, integrateR) S3method(print, Ncharacter) S3method(print, summaryMpfr) S3method("[", Ncharacter) S3method(as.data.frame, Ncharacter) ## not easily ## S3method("cbind", Ncharacter) ## S3method("rbind", Ncharacter) S3method(matrix, mpfr) ## useful, to have base::outer() work automatically: S3method(rep, mpfr) S3method(t, mpfr) S3method(t, mpfrMatrix) S3method(aperm, mpfrArray) ## trying to get base::factor() to work: S3method(unique, mpfr) Rmpfr/TODO0000644000175000017500000003047714107223103012166 0ustar nileshnilesh -*- org -*--> Emacs [Tab] key + [Org] menu; C-c C-o follows links * Very Short Term ** TODO 61) Q: Why is quantile() so slow [hence summary() very slow!]? A: because sort() |--> rank() is so slow (in C code!) l2x <- seqMpfr(mpfr(4, 1024), 513, by=1/16) # 8000 numbers of 1024 bits system.time(ql2x <- quantile(l2x, names=FALSE)) # user: 10.735 (nb-mm5, Nov.2020) *** quantile() -> sort(*, partial=.) -> xtfrm.default() -> rank(l2x) is so slow *** Partial SOLUTION (not yet implemented): use is.unsorted(.) which is *fast* FALSE for sorted vetors (as 'l2x' above) ** TODO 55b) possibly more documentation on .mpfr* functions, e.g. .getSign(), at least *internally* (roxygen) ** TODO 31) Valgrind problems + leaks: Brian's e-mail 2014-06-19; ~/R/Pkgs/Rmpfr.Rcheck_valgrind/ ** TODO 11) format() method for "mpfr", "mpfrArray" (and hence "mpfrMatrix") which nicely and correctly *jointly* formats (for "mpfr") and aligns columns ! Then, formatDec() would be unnecessary. drop0trailing is not really sensible there. ** TODO 19) outer() now works always ? {as rep() now S3 dispatches ---> need systematic checks *AND* docu changes! ** TODO 17b) see 'Ops' in R/Arith.R , Rmpfr:::.Math.codes, and design a "test all Ops" with all combinations of "mpfr", "numeric","logical" (and possibly more). * Short or Mid Term *** TODO Split this section into Short | Mid (?) ** TODO 60) Should have *exact* as.bigq.mpfr(), i.e, "mpfr" --> "bigq". (R's "bigq" is C 'mpq') ** TODO 62) integrateR(): option 'all.sums=TRUE' --> R/integrate-Romberg.R *** Inside the GMP library, have # -- Function: void mpq_set_f (mpq_t ROP, const mpf_t OP) # Set ROP to the value of OP. There is no rounding, this conversion is exact. *** MPFR documents 'mpf2mpfr.h' after which you can compile any mpf_ program.. ** DONE 63) R interface to mpfr's functions `mpfr_get_ld_2exp()` and `mpfr_frexp()` compatibly to DPQ's `ldexp(f, E)` and `frexp(x)`: -> frexpMpfr() and ldexpMpfr(). ** TODO 53) plogis() {and dlogis, qlogis} are "easy": do use /src/nmath/[dpq]logis.c, as they already use all the numerical tricks including R_Log1_Exp(x) .. : R_Log1_Exp(x) := ((x) > -M_LN2 ? log(-expm1(x)) : log1p(-exp(x))) ** TODO 54) zapsmall() would be nice, base::zapsmall() fails ** DONE 59) *exact* dhyper(), phyper().. -> in package 'DPQmpfr' dhyperQ() etc exact via 'gmp' exact rationals ** TODO 35) tests/bit-repr.R : Bits() fails to work with 2^k ** TODO 37) mpfrXport()/*Import() should work for arrays. Test Windows-portability: - as save() seems not portable; see ~/R/MM/Pkg-ex/Rmpfr/save-load-ex.R ** TODO 2) Now have working "mpfrMatrix", dim(.) <- ..; t(), %*%, crossprod()... - %*% should work the same as with numeric vectors - %*% t() ditto Note that matrix multiplication seems too slow --> ./Savicky-matrix-mult_tst.R - [i] & [i] work but [i,j] not yet --> want things to work like which( == ., arr.ind = TRUE) - ok [No longer sure if this is true :] For this, we must ensure that the methods are used, instead of the .Primitive base functions : One way: --> see ~/R/MM/NUMERICS/bessel-large-x.R -------------------------------- ## really interesting is bI(x., nu) {for "mpfr" argument}: ## it uses outer(), but that needs to dispatch on, e.g. "^", ## i.e., not only look at "base" environment(outer) <- as.environment("package:Rmpfr") environment(dim) <- as.environment("package:Rmpfr") environment(dimnames) <- as.environment("package:Rmpfr") environment(`dim<-`) <- as.environment("package:Rmpfr") environment(`dimnames<-`) <- as.environment("package:Rmpfr") environment(which) <- as.environment("package:Rmpfr") ** TODO 5) have seqMpfr(), but would like seq() methods, but that seems currently impossible because of a "design infelicity" in base::seq.default --- ???? E-mail to R-core ?? --> R/mpfr.R ** TODO 6) It is "wrong" that the class "Mnumber" also extends "character", "list"; but it's not clear we can find better definitions, see R/AllClasses.R ** TODO 7) Add tests for hypot() & atan2() to tests/special-fun-ex.R ** TODO 8) round(x, .) & signif(x, .) currently return "mpfr" numbers of the same precision. That *looks* ugly. Potentially add a swith 'keepPrec = FALSE' -- i.e. by default *reduce* precision to "match" 'digits' argument. ** TODO 16) psigamma(x, n) {and digamma(), trigamma() aliases} --> experiments in ~/R/MM/Pkg-ex/Rmpfr/psigamma.R ) Note that since, MPFR 3.0.0, there is a digamma(); .. which we now interface to ** TODO 18) ifelse() fails ... maybe I should mask it {or "fix it" via assign*() in base ?? -- they will love that!} or provide ifelse2() -- a fast simplified version ? ** TODO 24) Bernoulli(): we use builtin zeta(); alternatively, use *exact* rationals from 'gmp', using "bigq" (and "bigz") -- and R code from ~/R/Pkgs/copula/R/special-func.R ** TODO 26) (?) Revert the decision to *not* care about rounding mode in Ops/function, and rather expose that as in mpfr(), e.g., in R/Math.R roundMpfr -- see MPFR_RNDN in src/utils.c and others; --> use src/convert.c R_rnd2MP() -- and all the SEXP functions get an additional SEXP rnd_mode argument, the same as SEXP d2mpfr1() in src/convert.c has already. ** TODO 29) Our sum() should use system mpfr_sum() : mpfr_sum (mpfr_t ROP, mpfr_ptr const TAB[], unsigned long int N, mpfr_rnd_t RND) ** TODO 32) Use ./LUP.R to compute the lu() decomposition of an mpfrMatrix ---> solve() and use this for determinant() for larger (n >= 4 ?) dimensions! ** TODO 50) For *complex* arithmetic, build interface to the "MPC" library ---> http://www.multiprecision.org/mpc -- which is LGPL and itself builds on MPFR and GMP. Ubuntu now has 'libmpc-dev' (!) {but there's no '*-doc' package yet; on nb-mm, I've installed from source --> Info comes along} One idea: Since the names are so much in parallel, try to take each src/*.c file and mechanically s/mpfr/mpc/ producing a mpc version of that; then "the same" for the R interface code. ** TODO 51) Incomplete gamma, i.e. pgamma(), is being added to MPFR. -> do in Rmpfr! ~/F/IN-lists--2016-08 : From: paul zimmermann Subject: [MPFR] incomplete Gamma function Date: Mon, 18 Jan 2016 09:54:51 +0100 zimmerma@tomate:~/mpfr/tests$ ./tgamma_inc 60 30 100 1.3868299023788801161747839921242e80 *** Will be in MPFR 3.2.x (Oct.2016: current is 3.1.5) *** MPFR-devel(svn): https://gforge.inria.fr/scm/viewvc.php/mpfr/trunk/src/gamma_inc.c?view=markup - get: --> http://mpfr.loria.fr/gforge.html explains: - svn checkout https://scm.gforge.inria.fr/anonscm/svn/mpfr/trunk mpfr * Accomplished ** DONE 1) R: character -> mpfr "3.14159265358979323846264" -> mpfr ** DONE 3) "Arith" and "Compare" methods currently ``lose dim + dimnames'' for "mpfrArray" (& "mpfrMatrix") The solution is a bit tedious because the Ops do recycling pretty generously for vectors, but pretty stringently when one of the operands is a matrix. If the other part is a matrix their dim() must be identical, if just a vector, its length must be a divisor of length() ** DONE 10b) a factorialMPFR() which automatically uses full precision for integer-valued argument, notably using MPFR's mpfr_fac_ui; see also end of man/mpfr-class.Rd ** DONE 13) all the NOT_YET in src/Ops.c are implemented, *apart* from trigamma() --> TODO 16) ** DONE 14) Want to *change* 'precBits' of existing MPFR numbers; MPFR has mpfr_set_prec(X, PREC) but that sets the value to NaN. Manual: "In case you want to keep the previous value stored in X, use `mpfr_prec_round' instead." --> fulfilled via roundMpfr(x, precBits) ** DONE 15) beta(.,.) and lbeta(.,.) .. using my_mpfr_beta() in C. Interestingly, the speedup is not dramatical (50% for length 200; 300% for length 1) ** DONE 4) format() got more (optional) arguments, along the format.default() example. Note that an option to "round() after decimal" should not be needed, rather format(round(..), digits= ., drop0trailing=TRUE) does work. ** DONE 12) crossprod(), tcrossprod() (and more?) methods for "mpfrMatrix". ** DONE 10) chooseMpfr(a,n) is now implemented --- *NOT* based on gamma(), but rather n. ** DONE 11b) No longer --- problem were missing mpfr_clear() statements in src/utils.c : format() --> .mpfr2str() -> C mpfr2str() still suffers from a memory bug, inspite of my efforts in src/convert.c I think this is the MPFR library just allocating memory that's in use by R, but it seems hard to prove and or fix that. ** DONE 17a) as(1, "mpfr") & TRUE : no longer gives infinite recursion error ** DONE 17a) Write a 'Rmpfr-package' help page that mentions that we have *many* Math etc functions, including gamma, digamma, .... {which are not quickly visible on the help pages now}. ** DONE 20) integrateR( ... rel.tol, verbose= TRUE) : the precision of the output should be increased a bit, (still depending on rel.tol !) ** DONE 21) What's the exponent range -- and possibly change it: R interface in R/mpfr.R via .mpfr_erange() [and .mpfr_erange(.) <- v ] to - Function: mpfr_exp_t mpfr_get_emin (void) - Function: mpfr_exp_t mpfr_get_emax (void) - Function: int mpfr_set_emin (mpfr_exp_t exp) - Function: int mpfr_set_emax (mpfr_exp_t exp) - Function: mpfr_exp_t mpfr_get_emin_min (void) - Function: mpfr_exp_t mpfr_get_emin_max (void) - Function: mpfr_exp_t mpfr_get_emax_min (void) - Function: mpfr_exp_t mpfr_get_emax_max (void) ** DONE 22) apply(, .) --> S4 method ** DONE 22x) *do* test rank(), sort(), order() : we claim they work in man/mpfr-class.Rd quantile() should work from R 2.15.1 (June 2012) on ~~~~~~~~~~~~~~~~~ ** DONE 23) quantile() does not work ---- but will from R 2.15.1 with better quantile.default() Reason: in stats::quantile.default(), ifelse(h == 0, qs[i], (1 - h) * qs[i] + h * x[hi[i]]) produces a list of 'mpfr1' instead a real 'mpfr' vector. -> Fixed in ~/R/D/r-devel/R/src/library/stats/R/quantile.R ** DONE 23x) sumBinomMpfr() accept f.x ** DONE 28) determinant() and hence det() "fail" (with a reasonable error message). Easy: go via asNumeric(.) with a warning() that can be suppressed Standard R uses LAPACK's LU() decomposition. Would be cool to have that in C (using MPFR). Alternatively, do it for 2x2 and via recursion mxm for small m. (but it is *really* inefficient: complexity \propto m! ) ** DONE 30) pmin() and pmax(), for simple cases pmin(x,n) are now, 2013-02, quite "fast", (see also --> ~/R/MM/Pkg-ex/Rmpfr/SLOW-pmin.R) ** DONE 33) asNumeric(mpfr(10, 99)^500) gives 1.797693e+308 without warning. Should (warn or) give Inf ** DONE 36) got mpfrImport(), reading mpfrXport() ** DONE 38) Define a norm() method. For expm(*, "Higham08") need solve() ! ** DONE 34) Can specify the rounding mode in mpfr() and roundMpfr(), since 2015-08-08 ** DONE 9) median() now works, as does mean(, trim = *) and quantile() w/o warning. ** DONE is.finite(.) etc: *Must* keep matrices -> src/utils.c ** DONE 52) No longer use 'representation' but rather 'slots' in 'setClass(..)' ** DONE 25) mpfr(, ...) should work: return argument unchanged *if* precision and rounding mode are ok; otherwise use roundMpfr() *BUT* that needs an additional rnd.mode argument -- as mpfr ** DONE 27) Now have simple sapplyMpfr() ** DONE 57) Fix pnorm() bugs reported by Jerry Lewis (>> ~/R/MM/Pkg-ex/Rmpfr/pnorm-* ) ** DONE 58) print() somehow fails to use max.digits = 9999 [print.mpfr(*, max.digits = ...)] ??? *** Why did we introduce 'max.digits' *and* allow digits=NULL to use *all* digits before the decimal point? **** I now think max.digits is almost superfluous if digits=NULL behaved as promised: We have in R code comments __digits = NULL : use as many digits "as needed"__ , and in help man/formatMpfr.Rd __The default, \code{NULL}, uses enough digits to represent the full precision, often one or two digits more than you would expect.__ ** DONE 56) Add regr.tests for new dgamma() !! ** DONE 55a) .getPrec(), .mpfr_erange, .mpfr_erange_set, .mpfr_maxPrec, .mpfr_minPrec etc are documented now. Rmpfr/configure.ac0000644000175000017500000000430214127016751013763 0ustar nileshnilesh# autoconf this file --> configure AC_INIT AC_CONFIG_SRCDIR([Rmpfr]) AC_CONFIG_SRCDIR([DESCRIPTION]) dnl Select an optional include path, from a configure option dnl or from an environment variable >> mpfr_INCLUDE << AC_ARG_WITH([mpfr-include], AS_HELP_STRING([--with-mpfr-include=INCLUDE_PATH],[the location of MPFR header files]), [mpfr_include_path=$withval]) if test -n "$mpfr_include_path" ; then MPFR_CPPFLAGS="-I${mpfr_include_path}" elif test -n "${mpfr_INCLUDE}" ; then MPFR_CPPFLAGS="-I${mpfr_INCLUDE}" fi dnl Ditto for a library path environment variable >> mpfr_LDFLAGS << AC_ARG_WITH([mpfr-lib], AS_HELP_STRING([--with-mpfr-lib=LIB_PATH],[the location of MPFR libraries]), [mpfr_lib_path=$withval]) if test -n "$mpfr_lib_path" ; then MPFR_LDFLAGS="-L$mpfr_lib_path ${LDFLAGS}" elif test -n "${mpfr_LDFLAGS}" ; then MPFR_LDFLAGS="-L${mpfr_LDFLAGS} ${LDFLAGS}" fi dnl Now find the compiler and compiler flags to use : ${R_HOME=`R RHOME`} if test -z "${R_HOME}"; then echo "could not determine R_HOME" exit 1 fi CC=`"${R_HOME}/bin/R" CMD config CC` CFLAGS=`"${R_HOME}/bin/R" CMD config CFLAGS` CPPFLAGS=`"${R_HOME}/bin/R" CMD config CPPFLAGS` LDFLAGS=`"${R_HOME}/bin/R" CMD config LDFLAGS` dnl Setup the compilers AC_PROG_CC AC_PROG_CPP dnl use the include and lib CPPFLAGS="${CPPFLAGS} ${MPFR_CPPFLAGS}" LDFLAGS="${LDFLAGS} ${MPFR_LDFLAGS}" PKG_CPPFLAGS=$CPPFLAGS PKG_CFLAGS=$CFLAGS PKG_LDFLAGS=$LDFLAGS AC_CHECK_HEADER([mpfr.h], , [AC_MSG_ERROR([Header file mpfr.h not found; maybe use --with-mpfr-include=INCLUDE_PATH])]) AC_CHECK_HEADER([gmp.h], , [AC_MSG_ERROR([Header file gmp.h not found; maybe use --with-mpfr-include=INCLUDE_PATH])]) AC_CHECK_LIB(gmp, __gmpz_init, , [AC_MSG_ERROR([GNU MP not found, see README])]) AC_CHECK_LIB(mpfr, mpfr_init, , [AC_MSG_ERROR([MPFR Library not found, see README])]) dnl Our Version check <= 3 -- etc seems to fail nowadays dnl src/Rmpfr_utils.h dnl ~~~~~~~~~~~~~~~~~ AC_CHECK_LIB(mpfr, mpfr_digamma, , [AC_MSG_ERROR([MPFR Library must be at least version 3.0.0, see README])]) AC_SUBST(PKG_CPPFLAGS) AC_SUBST(PKG_CFLAGS) AC_SUBST(PKG_LDFLAGS) AC_CONFIG_FILES(src/Makevars) AC_OUTPUT