A JavaScript library for arbitrary-precision arithmetic.
+ + ++ See the README on GitHub for a + quick-start introduction. +
+
+ In all examples below, var
and semicolons are not shown, and if a commented-out
+ value is in quotes it means toString
has been called on the preceding expression.
+
BigNumber(n [, base]) ⇒ BigNumber
+
+ n
: number|string|BigNumber
+ base
: number: integer, 2
to 36
inclusive. (See
+ ALPHABET
to extend this range).
+
+ Returns a new instance of a BigNumber object with value n
, where n
+ is a numeric value in the specified base
, or base 10
if
+ base
is omitted or is null
or undefined
.
+
+x = new BigNumber(123.4567) // '123.4567' +// 'new' is optional +y = BigNumber(x) // '123.4567'+
+ If n
is a base 10
value it can be in normal (fixed-point) or
+ exponential notation. Values in other bases must be in normal notation. Values in any base can
+ have fraction digits, i.e. digits after the decimal point.
+
+new BigNumber(43210) // '43210' +new BigNumber('4.321e+4') // '43210' +new BigNumber('-735.0918e-430') // '-7.350918e-428' +new BigNumber('123412421.234324', 5) // '607236.557696'+
+ Signed 0
, signed Infinity
and NaN
are supported.
+
+new BigNumber('-Infinity') // '-Infinity' +new BigNumber(NaN) // 'NaN' +new BigNumber(-0) // '0' +new BigNumber('.5') // '0.5' +new BigNumber('+2') // '2'+
+ String values in hexadecimal literal form, e.g. '0xff'
, are valid, as are
+ string values with the octal and binary prefixs '0o'
and '0b'
.
+ String values in octal literal form without the prefix will be interpreted as
+ decimals, e.g. '011'
is interpreted as 11, not 9.
+
+new BigNumber(-10110100.1, 2) // '-180.5' +new BigNumber('-0b10110100.1') // '-180.5' +new BigNumber('ff.8', 16) // '255.5' +new BigNumber('0xff.8') // '255.5'+
+ If a base is specified, n
is rounded according to the current
+ DECIMAL_PLACES
and
+ ROUNDING_MODE
settings. This includes base
+ 10
so don't include a base
parameter for decimal values unless
+ this behaviour is wanted.
+
BigNumber.config({ DECIMAL_PLACES: 5 }) +new BigNumber(1.23456789) // '1.23456789' +new BigNumber(1.23456789, 10) // '1.23457'+
An error is thrown if base
is invalid. See Errors.
+ There is no limit to the number of digits of a value of type string (other than
+ that of JavaScript's maximum array size). See RANGE
to set
+ the maximum and minimum possible exponent value of a BigNumber.
+
+new BigNumber('5032485723458348569331745.33434346346912144534543') +new BigNumber('4.321e10000000')+
BigNumber NaN
is returned if n
is invalid
+ (unless BigNumber.DEBUG
is true
, see below).
+new BigNumber('.1*') // 'NaN' +new BigNumber('blurgh') // 'NaN' +new BigNumber(9, 2) // 'NaN'+
+ To aid in debugging, if BigNumber.DEBUG
is true
then an error will
+ be thrown on an invalid n
. An error will also be thrown if n
is of
+ type number with more than 15
significant digits, as calling
+ toString
or valueOf
on
+ these numbers may not result in the intended value.
+
+console.log(823456789123456.3) // 823456789123456.2 +new BigNumber(823456789123456.3) // '823456789123456.2' +BigNumber.DEBUG = true +// '[BigNumber Error] Number primitive has more than 15 significant digits' +new BigNumber(823456789123456.3) +// '[BigNumber Error] Not a base 2 number' +new BigNumber(9, 2)+
+ A BigNumber can also be created from an object literal.
+ Use isBigNumber
to check that it is well-formed.
+
new BigNumber({ s: 1, e: 2, c: [ 777, 12300000000000 ], _isBigNumber: true }) // '777.123'+ + + + +
The static methods of a BigNumber constructor.
+ + + + +.clone([object]) ⇒ BigNumber constructor
+ object
: object
+ Returns a new independent BigNumber constructor with configuration as described by
+ object
(see config
), or with the default
+ configuration if object
is null
or undefined
.
+
+ Throws if object
is not an object. See Errors.
+
BigNumber.config({ DECIMAL_PLACES: 5 }) +BN = BigNumber.clone({ DECIMAL_PLACES: 9 }) + +x = new BigNumber(1) +y = new BN(1) + +x.div(3) // 0.33333 +y.div(3) // 0.333333333 + +// BN = BigNumber.clone({ DECIMAL_PLACES: 9 }) is equivalent to: +BN = BigNumber.clone() +BN.config({ DECIMAL_PLACES: 9 })+ + + +
set([object]) ⇒ object
+ object
: object: an object that contains some or all of the following
+ properties.
+
Configures the settings for this particular BigNumber constructor.
+ +DECIMAL_PLACES
0
to 1e+9
inclusive20
+ BigNumber.config({ DECIMAL_PLACES: 5 }) +BigNumber.set({ DECIMAL_PLACES: 5 }) // equivalent+
ROUNDING_MODE
0
to 8
inclusive4
(ROUND_HALF_UP
)
+ decimalPlaces
,
+ precision
,
+ toExponential
,
+ toFixed
,
+ toFormat
and
+ toPrecision
.
+ BigNumber.config({ ROUNDING_MODE: 0 }) +BigNumber.set({ ROUNDING_MODE: BigNumber.ROUND_UP }) // equivalent+
EXPONENTIAL_AT
0
to 1e+9
inclusive, or
+ -1e+9
to 0
inclusive, integer
+ 0
to 1e+9
inclusive ][-7, 20]
+ toString
returns exponential notation.
+ [-7, 20]
.
+ BigNumber.config({ EXPONENTIAL_AT: 2 }) +new BigNumber(12.3) // '12.3' e is only 1 +new BigNumber(123) // '1.23e+2' +new BigNumber(0.123) // '0.123' e is only -1 +new BigNumber(0.0123) // '1.23e-2' + +BigNumber.config({ EXPONENTIAL_AT: [-7, 20] }) +new BigNumber(123456789) // '123456789' e is only 8 +new BigNumber(0.000000123) // '1.23e-7' + +// Almost never return exponential notation: +BigNumber.config({ EXPONENTIAL_AT: 1e+9 }) + +// Always return exponential notation: +BigNumber.config({ EXPONENTIAL_AT: 0 })+
EXPONENTIAL_AT
, the toFixed
method
+ will always return a value in normal notation and the toExponential
method
+ will always return a value in exponential form.
+ toString
with a base argument, e.g. toString(10)
, will
+ also always return normal notation.
+ RANGE
1
to 1e+9
inclusive, or
+ -1e+9
to -1
inclusive, integer
+ 1
to 1e+9
inclusive ][-1e+9, 1e+9]
+ Infinity
and underflow to
+ zero occurs.
+ Infinity
and those with a
+ negative exponent of greater magnitude become zero.
+ Infinity
, use [-324, 308]
.
+ BigNumber.config({ RANGE: 500 }) +BigNumber.config().RANGE // [ -500, 500 ] +new BigNumber('9.999e499') // '9.999e+499' +new BigNumber('1e500') // 'Infinity' +new BigNumber('1e-499') // '1e-499' +new BigNumber('1e-500') // '0' + +BigNumber.config({ RANGE: [-3, 4] }) +new BigNumber(99999) // '99999' e is only 4 +new BigNumber(100000) // 'Infinity' e is 5 +new BigNumber(0.001) // '0.01' e is only -3 +new BigNumber(0.0001) // '0' e is -4+
9.999...e+1000000000
.1e-1000000000
.
+ CRYPTO
true
or false
.false
+ CRYPTO
is set to true
then the
+ random
method will generate random digits using
+ crypto.getRandomValues
in browsers that support it, or
+ crypto.randomBytes
if using Node.js.
+ CRYPTO
to true
will fail and an exception will be thrown.
+ CRYPTO
is false
then the source of randomness used will be
+ Math.random
(which is assumed to generate at least 30
bits of
+ randomness).
+ random
.+// Node.js +global.crypto = require('crypto') + +BigNumber.config({ CRYPTO: true }) +BigNumber.config().CRYPTO // true +BigNumber.random() // 0.54340758610486147524+
MODULO_MODE
0
to 9
inclusive1
(ROUND_DOWN
)
+ a mod n
.q = a / n
, is calculated according to the
+ ROUNDING_MODE
that corresponds to the chosen
+ MODULO_MODE
.
+ r
, is calculated as: r = a - n * q
.Property | Value | Description |
---|---|---|
ROUND_UP | 0 | ++ The remainder is positive if the dividend is negative, otherwise it is negative. + | +
ROUND_DOWN | 1 | +
+ The remainder has the same sign as the dividend. + This uses 'truncating division' and matches the behaviour of JavaScript's + remainder operator % .
+ |
+
ROUND_FLOOR | 3 | +
+ The remainder has the same sign as the divisor. + This matches Python's % operator.
+ |
+
ROUND_HALF_EVEN | 6 | +The IEEE 754 remainder function. | +
EUCLID | 9 | +
+ The remainder is always positive. Euclidian division: + q = sign(n) * floor(a / abs(n))
+ |
+
modulo
.BigNumber.config({ MODULO_MODE: BigNumber.EUCLID }) +BigNumber.config({ MODULO_MODE: 9 }) // equivalent+
POW_PRECISION
0
to 1e+9
inclusive.0
+ 0
, the number of significant digits will not be limited.exponentiatedBy
.BigNumber.config({ POW_PRECISION: 100 })
FORMAT
FORMAT
object configures the format of the string returned by the
+ toFormat
method.
+ FORMAT
object that are
+ recognised, and their default values.
+ FORMAT
object will not be checked for validity. The existing
+ FORMAT
object will simply be replaced by the object that is passed in.
+ The object can include any number of the properties shown below.
+ toFormat
for examples of usage.+BigNumber.config({ + FORMAT: { + // string to prepend + prefix: '', + // decimal separator + decimalSeparator: '.', + // grouping separator of the integer part + groupSeparator: ',', + // primary grouping size of the integer part + groupSize: 3, + // secondary grouping size of the integer part + secondaryGroupSize: 0, + // grouping separator of the fraction part + fractionGroupSeparator: ' ', + // grouping size of the fraction part + fractionGroupSize: 0, + // string to append + suffix: '' + } +});+
ALPHABET
'0123456789abcdefghijklmnopqrstuvwxyz'
+ BigNumber
constructor or
+ toString
.
+ '+'
and '-'
, or the decimal separator '.'
.
+ // duodecimal (base 12) +BigNumber.config({ ALPHABET: '0123456789TE' }) +x = new BigNumber('T', 12) +x.toString() // '10' +x.toString(12) // 'T'+
Returns an object with the above properties and their current values.
+
+ Throws if object
is not an object, or if an invalid value is assigned to
+ one or more of the above properties. See Errors.
+
+BigNumber.config({ + DECIMAL_PLACES: 40, + ROUNDING_MODE: BigNumber.ROUND_HALF_CEIL, + EXPONENTIAL_AT: [-10, 20], + RANGE: [-500, 500], + CRYPTO: true, + MODULO_MODE: BigNumber.ROUND_FLOOR, + POW_PRECISION: 80, + FORMAT: { + groupSize: 3, + groupSeparator: ' ', + decimalSeparator: ',' + }, + ALPHABET: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_' +}); + +obj = BigNumber.config(); +obj.DECIMAL_PLACES // 40 +obj.RANGE // [-500, 500]+ + + +
.isBigNumber(value) ⇒ boolean
+ value
: any
+ Returns true
if value
is a BigNumber instance, otherwise returns
+ false
.
+
x = 42 +y = new BigNumber(x) + +BigNumber.isBigNumber(x) // false +y instanceof BigNumber // true +BigNumber.isBigNumber(y) // true + +BN = BigNumber.clone(); +z = new BN(x) +z instanceof BigNumber // false +BigNumber.isBigNumber(z) // true+
+ If value
is a BigNumber instance and BigNumber.DEBUG
is true
,
+ then this method will also check if value
is well-formed, and throw if it is not.
+ See Errors.
+
+ The check can be useful if creating a BigNumber from an object literal. + See BigNumber. +
++x = new BigNumber(10) + +// Change x.c to an illegitimate value. +x.c = NaN + +BigNumber.DEBUG = false + +// No error. +BigNumber.isBigNumber(x) // true + +BigNumber.DEBUG = true + +// Error. +BigNumber.isBigNumber(x) // '[BigNumber Error] Invalid BigNumber'+ + + +
.max(n...) ⇒ BigNumber
+ n
: number|string|BigNumber
+ See BigNumber
for further parameter details.
+
+ Returns a BigNumber whose value is the maximum of the arguments. +
+The return value is always exact and unrounded.
+x = new BigNumber('3257869345.0378653') +BigNumber.maximum(4e9, x, '123456789.9') // '4000000000' + +arr = [12, '13', new BigNumber(14)] +BigNumber.max.apply(null, arr) // '14'+ + + +
.min(n...) ⇒ BigNumber
+ n
: number|string|BigNumber
+ See BigNumber
for further parameter details.
+
+ Returns a BigNumber whose value is the minimum of the arguments. +
+The return value is always exact and unrounded.
+x = new BigNumber('3257869345.0378653') +BigNumber.minimum(4e9, x, '123456789.9') // '123456789.9' + +arr = [2, new BigNumber(-14), '-15.9999', -12] +BigNumber.min.apply(null, arr) // '-15.9999'+ + + +
.random([dp]) ⇒ BigNumber
+ dp
: number: integer, 0
to 1e+9
inclusive
+ Returns a new BigNumber with a pseudo-random value equal to or greater than 0
and
+ less than 1
.
+
+ The return value will have dp
decimal places (or less if trailing zeros are
+ produced).
+ If dp
is omitted then the number of decimal places will default to the current
+ DECIMAL_PLACES
setting.
+
+ Depending on the value of this BigNumber constructor's
+ CRYPTO
setting and the support for the
+ crypto
object in the host environment, the random digits of the return value are
+ generated by either Math.random
(fastest), crypto.getRandomValues
+ (Web Cryptography API in recent browsers) or crypto.randomBytes
(Node.js).
+
+ To be able to set CRYPTO
to true
when using
+ Node.js, the crypto
object must be available globally:
+
global.crypto = require('crypto')+
+ If CRYPTO
is true
, i.e. one of the
+ crypto
methods is to be used, the value of a returned BigNumber should be
+ cryptographically-secure and statistically indistinguishable from a random value.
+
+ Throws if dp
is invalid. See Errors.
+
BigNumber.config({ DECIMAL_PLACES: 10 }) +BigNumber.random() // '0.4117936847' +BigNumber.random(20) // '0.78193327636914089009'+ + + +
.sum(n...) ⇒ BigNumber
+ n
: number|string|BigNumber
+ See BigNumber
for further parameter details.
+
Returns a BigNumber whose value is the sum of the arguments.
+The return value is always exact and unrounded.
+x = new BigNumber('3257869345.0378653') +BigNumber.sum(4e9, x, '123456789.9') // '7381326134.9378653' + +arr = [2, new BigNumber(14), '15.9999', 12] +BigNumber.sum.apply(null, arr) // '43.9999'+ + + +
+ The library's enumerated rounding modes are stored as properties of the constructor.
+ (They are not referenced internally by the library itself.)
+
+ Rounding modes 0
to 6
(inclusive) are the same as those of Java's
+ BigDecimal class.
+
Property | +Value | +Description | +
---|---|---|
ROUND_UP | +0 | +Rounds away from zero | +
ROUND_DOWN | +1 | +Rounds towards zero | +
ROUND_CEIL | +2 | +Rounds towards Infinity |
+
ROUND_FLOOR | +3 | +Rounds towards -Infinity |
+
ROUND_HALF_UP | +4 | +
+ Rounds towards nearest neighbour. + If equidistant, rounds away from zero + |
+
ROUND_HALF_DOWN | +5 | +
+ Rounds towards nearest neighbour. + If equidistant, rounds towards zero + |
+
ROUND_HALF_EVEN | +6 | +
+ Rounds towards nearest neighbour. + If equidistant, rounds towards even neighbour + |
+
ROUND_HALF_CEIL | +7 | +
+ Rounds towards nearest neighbour. + If equidistant, rounds towards Infinity
+ |
+
ROUND_HALF_FLOOR | +8 | +
+ Rounds towards nearest neighbour. + If equidistant, rounds towards -Infinity
+ |
+
+BigNumber.config({ ROUNDING_MODE: BigNumber.ROUND_CEIL }) +BigNumber.config({ ROUNDING_MODE: 2 }) // equivalent+ +
undefined|false|true
+
+ If BigNumber.DEBUG
is set true
then an error will be thrown
+ if this BigNumber constructor receives an invalid value, such as
+ a value of type number with more than 15
significant digits.
+ See BigNumber.
+
+ An error will also be thrown if the isBigNumber
+ method receives a BigNumber that is not well-formed.
+ See isBigNumber
.
+
BigNumber.DEBUG = true+ + +
The methods inherited by a BigNumber instance from its constructor's prototype object.
+A BigNumber is immutable in the sense that it is not changed by its methods.
+
+ The treatment of ±0
, ±Infinity
and NaN
is
+ consistent with how JavaScript treats these values.
+
Many method names have a shorter alias.
+ + + +.abs() ⇒ BigNumber
+ Returns a BigNumber whose value is the absolute value, i.e. the magnitude, of the value of + this BigNumber. +
+The return value is always exact and unrounded.
++x = new BigNumber(-0.8) +y = x.absoluteValue() // '0.8' +z = y.abs() // '0.8'+ + + +
.comparedTo(n [, base]) ⇒ number
+
+ n
: number|string|BigNumber
+ base
: number
+ See BigNumber for further parameter details.
+
Returns | |
---|---|
1 |
+ If the value of this BigNumber is greater than the value of n |
+
-1 |
+ If the value of this BigNumber is less than the value of n |
+
0 |
+ If this BigNumber and n have the same value |
+
null |
+ If the value of either this BigNumber or n is NaN |
+
+x = new BigNumber(Infinity) +y = new BigNumber(5) +x.comparedTo(y) // 1 +x.comparedTo(x.minus(1)) // 0 +y.comparedTo(NaN) // null +y.comparedTo('110', 2) // -1+ + + +
.dp([dp [, rm]]) ⇒ BigNumber|number
+
+ dp
: number: integer, 0
to 1e+9
inclusive
+ rm
: number: integer, 0
to 8
inclusive
+
+ If dp
is a number, returns a BigNumber whose value is the value of this BigNumber
+ rounded by rounding mode rm
to a maximum of dp
decimal places.
+
+ If dp
is omitted, or is null
or undefined
, the return
+ value is the number of decimal places of the value of this BigNumber, or null
if
+ the value of this BigNumber is ±Infinity
or NaN
.
+
+ If rm
is omitted, or is null
or undefined
,
+ ROUNDING_MODE
is used.
+
+ Throws if dp
or rm
is invalid. See Errors.
+
+x = new BigNumber(1234.56) +x.decimalPlaces(1) // '1234.6' +x.dp() // 2 +x.decimalPlaces(2) // '1234.56' +x.dp(10) // '1234.56' +x.decimalPlaces(0, 1) // '1234' +x.dp(0, 6) // '1235' +x.decimalPlaces(1, 1) // '1234.5' +x.dp(1, BigNumber.ROUND_HALF_EVEN) // '1234.6' +x // '1234.56' +y = new BigNumber('9.9e-101') +y.dp() // 102+ + + +
.div(n [, base]) ⇒ BigNumber
+
+ n
: number|string|BigNumber
+ base
: number
+ See BigNumber for further parameter details.
+
+ Returns a BigNumber whose value is the value of this BigNumber divided by
+ n
, rounded according to the current
+ DECIMAL_PLACES
and
+ ROUNDING_MODE
settings.
+
+x = new BigNumber(355) +y = new BigNumber(113) +x.dividedBy(y) // '3.14159292035398230088' +x.div(5) // '71' +x.div(47, 16) // '5'+ + + +
.idiv(n [, base]) ⇒
+ BigNumber
+
+ n
: number|string|BigNumber
+ base
: number
+ See BigNumber for further parameter details.
+
+ Returns a BigNumber whose value is the integer part of dividing the value of this BigNumber by
+ n
.
+
+x = new BigNumber(5) +y = new BigNumber(3) +x.dividedToIntegerBy(y) // '1' +x.idiv(0.7) // '7' +x.idiv('0.f', 16) // '5'+ + + +
.pow(n [, m]) ⇒ BigNumber
+
+ n
: number|string|BigNumber: integer
+ m
: number|string|BigNumber
+
+ Returns a BigNumber whose value is the value of this BigNumber exponentiated by
+ n
, i.e. raised to the power n
, and optionally modulo a modulus
+ m
.
+
+ Throws if n
is not an integer. See Errors.
+
+ If n
is negative the result is rounded according to the current
+ DECIMAL_PLACES
and
+ ROUNDING_MODE
settings.
+
+ As the number of digits of the result of the power operation can grow so large so quickly,
+ e.g. 123.45610000 has over 50000
digits, the number of significant
+ digits calculated is limited to the value of the
+ POW_PRECISION
setting (unless a modulus
+ m
is specified).
+
+ By default POW_PRECISION
is set to 0
.
+ This means that an unlimited number of significant digits will be calculated, and that the
+ method's performance will decrease dramatically for larger exponents.
+
+ If m
is specified and the value of m
, n
and this
+ BigNumber are integers, and n
is positive, then a fast modular exponentiation
+ algorithm is used, otherwise the operation will be performed as
+ x.exponentiatedBy(n).modulo(m)
with a
+ POW_PRECISION
of 0
.
+
+Math.pow(0.7, 2) // 0.48999999999999994 +x = new BigNumber(0.7) +x.exponentiatedBy(2) // '0.49' +BigNumber(3).pow(-2) // '0.11111111111111111111'+ + + +
.integerValue([rm]) ⇒ BigNumber
+
+ rm
: number: integer, 0
to 8
inclusive
+
+ Returns a BigNumber whose value is the value of this BigNumber rounded to an integer using
+ rounding mode rm
.
+
+ If rm
is omitted, or is null
or undefined
,
+ ROUNDING_MODE
is used.
+
+ Throws if rm
is invalid. See Errors.
+
+x = new BigNumber(123.456) +x.integerValue() // '123' +x.integerValue(BigNumber.ROUND_CEIL) // '124' +y = new BigNumber(-12.7) +y.integerValue() // '-13' +y.integerValue(BigNumber.ROUND_DOWN) // '-12'+
+ The following is an example of how to add a prototype method that emulates JavaScript's
+ Math.round
function. Math.ceil
, Math.floor
and
+ Math.trunc
can be emulated in the same way with
+ BigNumber.ROUND_CEIL
, BigNumber.ROUND_FLOOR
and
+ BigNumber.ROUND_DOWN
respectively.
+
+BigNumber.prototype.round = function (n) { + return n.integerValue(BigNumber.ROUND_HALF_CEIL); +}; +x.round() // '123'+ + + +
.eq(n [, base]) ⇒ boolean
+ n
: number|string|BigNumber
+ base
: number
+ See BigNumber for further parameter details.
+
+ Returns true
if the value of this BigNumber is equal to the value of
+ n
, otherwise returns false
.
+ As with JavaScript, NaN
does not equal NaN
.
+
Note: This method uses the comparedTo
method internally.
+0 === 1e-324 // true +x = new BigNumber(0) +x.isEqualTo('1e-324') // false +BigNumber(-0).eq(x) // true ( -0 === 0 ) +BigNumber(255).eq('ff', 16) // true + +y = new BigNumber(NaN) +y.isEqualTo(NaN) // false+ + + +
.isFinite() ⇒ boolean
+ Returns true
if the value of this BigNumber is a finite number, otherwise
+ returns false
.
+
+ The only possible non-finite values of a BigNumber are NaN
, Infinity
+ and -Infinity
.
+
+x = new BigNumber(1) +x.isFinite() // true +y = new BigNumber(Infinity) +y.isFinite() // false+
+ Note: The native method isFinite()
can be used if
+ n <= Number.MAX_VALUE
.
+
.gt(n [, base]) ⇒ boolean
+ n
: number|string|BigNumber
+ base
: number
+ See BigNumber for further parameter details.
+
+ Returns true
if the value of this BigNumber is greater than the value of
+ n
, otherwise returns false
.
+
Note: This method uses the comparedTo
method internally.
+0.1 > (0.3 - 0.2) // true +x = new BigNumber(0.1) +x.isGreaterThan(BigNumber(0.3).minus(0.2)) // false +BigNumber(0).gt(x) // false +BigNumber(11, 3).gt(11.1, 2) // true+ + + +
.gte(n [, base]) ⇒ boolean
+
+ n
: number|string|BigNumber
+ base
: number
+ See BigNumber for further parameter details.
+
+ Returns true
if the value of this BigNumber is greater than or equal to the value
+ of n
, otherwise returns false
.
+
Note: This method uses the comparedTo
method internally.
+(0.3 - 0.2) >= 0.1 // false +x = new BigNumber(0.3).minus(0.2) +x.isGreaterThanOrEqualTo(0.1) // true +BigNumber(1).gte(x) // true +BigNumber(10, 18).gte('i', 36) // true+ + + +
.isInteger() ⇒ boolean
+ Returns true
if the value of this BigNumber is an integer, otherwise returns
+ false
.
+
+x = new BigNumber(1) +x.isInteger() // true +y = new BigNumber(123.456) +y.isInteger() // false+ + + +
.lt(n [, base]) ⇒ boolean
+ n
: number|string|BigNumber
+ base
: number
+ See BigNumber for further parameter details.
+
+ Returns true
if the value of this BigNumber is less than the value of
+ n
, otherwise returns false
.
+
Note: This method uses the comparedTo
method internally.
+(0.3 - 0.2) < 0.1 // true +x = new BigNumber(0.3).minus(0.2) +x.isLessThan(0.1) // false +BigNumber(0).lt(x) // true +BigNumber(11.1, 2).lt(11, 3) // true+ + + +
.lte(n [, base]) ⇒ boolean
+
+ n
: number|string|BigNumber
+ base
: number
+ See BigNumber for further parameter details.
+
+ Returns true
if the value of this BigNumber is less than or equal to the value of
+ n
, otherwise returns false
.
+
Note: This method uses the comparedTo
method internally.
+0.1 <= (0.3 - 0.2) // false +x = new BigNumber(0.1) +x.isLessThanOrEqualTo(BigNumber(0.3).minus(0.2)) // true +BigNumber(-1).lte(x) // true +BigNumber(10, 18).lte('i', 36) // true+ + + +
.isNaN() ⇒ boolean
+ Returns true
if the value of this BigNumber is NaN
, otherwise
+ returns false
.
+
+x = new BigNumber(NaN) +x.isNaN() // true +y = new BigNumber('Infinity') +y.isNaN() // false+
Note: The native method isNaN()
can also be used.
.isNegative() ⇒ boolean
+ Returns true
if the sign of this BigNumber is negative, otherwise returns
+ false
.
+
+x = new BigNumber(-0) +x.isNegative() // true +y = new BigNumber(2) +y.isNegative() // false+
Note: n < 0
can be used if n <= -Number.MIN_VALUE
.
.isPositive() ⇒ boolean
+ Returns true
if the sign of this BigNumber is positive, otherwise returns
+ false
.
+
+x = new BigNumber(-0) +x.isPositive() // false +y = new BigNumber(2) +y.isPositive() // true+ + + +
.isZero() ⇒ boolean
+ Returns true
if the value of this BigNumber is zero or minus zero, otherwise
+ returns false
.
+
+x = new BigNumber(-0) +x.isZero() && x.isNegative() // true +y = new BigNumber(Infinity) +y.isZero() // false+
Note: n == 0
can be used if n >= Number.MIN_VALUE
.
.minus(n [, base]) ⇒ BigNumber
+
+ n
: number|string|BigNumber
+ base
: number
+ See BigNumber for further parameter details.
+
Returns a BigNumber whose value is the value of this BigNumber minus n
.
The return value is always exact and unrounded.
++0.3 - 0.1 // 0.19999999999999998 +x = new BigNumber(0.3) +x.minus(0.1) // '0.2' +x.minus(0.6, 20) // '0'+ + + +
.mod(n [, base]) ⇒ BigNumber
+ n
: number|string|BigNumber
+ base
: number
+ See BigNumber for further parameter details.
+
+ Returns a BigNumber whose value is the value of this BigNumber modulo n
, i.e.
+ the integer remainder of dividing this BigNumber by n
.
+
+ The value returned, and in particular its sign, is dependent on the value of the
+ MODULO_MODE
setting of this BigNumber constructor.
+ If it is 1
(default value), the result will have the same sign as this BigNumber,
+ and it will match that of Javascript's %
operator (within the limits of double
+ precision) and BigDecimal's remainder
method.
+
The return value is always exact and unrounded.
+
+ See MODULO_MODE
for a description of the other
+ modulo modes.
+
+1 % 0.9 // 0.09999999999999998 +x = new BigNumber(1) +x.modulo(0.9) // '0.1' +y = new BigNumber(33) +y.mod('a', 33) // '3'+ + + +
.times(n [, base]) ⇒ BigNumber
+
+ n
: number|string|BigNumber
+ base
: number
+ See BigNumber for further parameter details.
+
+ Returns a BigNumber whose value is the value of this BigNumber multiplied by n
.
+
The return value is always exact and unrounded.
++0.6 * 3 // 1.7999999999999998 +x = new BigNumber(0.6) +y = x.multipliedBy(3) // '1.8' +BigNumber('7e+500').times(y) // '1.26e+501' +x.multipliedBy('-a', 16) // '-6'+ + + +
.negated() ⇒ BigNumber
+ Returns a BigNumber whose value is the value of this BigNumber negated, i.e. multiplied by
+ -1
.
+
+x = new BigNumber(1.8) +x.negated() // '-1.8' +y = new BigNumber(-1.3) +y.negated() // '1.3'+ + + +
.plus(n [, base]) ⇒ BigNumber
+ n
: number|string|BigNumber
+ base
: number
+ See BigNumber for further parameter details.
+
Returns a BigNumber whose value is the value of this BigNumber plus n
.
The return value is always exact and unrounded.
++0.1 + 0.2 // 0.30000000000000004 +x = new BigNumber(0.1) +y = x.plus(0.2) // '0.3' +BigNumber(0.7).plus(x).plus(y) // '1' +x.plus('0.1', 8) // '0.225'+ + + +
.sd([d [, rm]]) ⇒ BigNumber|number
+
+ d
: number|boolean: integer, 1
to 1e+9
+ inclusive, or true
or false
+ rm
: number: integer, 0
to 8
inclusive.
+
+ If d
is a number, returns a BigNumber whose value is the value of this BigNumber
+ rounded to a precision of d
significant digits using rounding mode
+ rm
.
+
+ If d
is omitted or is null
or undefined
, the return
+ value is the number of significant digits of the value of this BigNumber, or null
+ if the value of this BigNumber is ±Infinity
or NaN
.
+ If d
is true
then any trailing zeros of the integer
+ part of a number are counted as significant digits, otherwise they are not.
+
+ If rm
is omitted or is null
or undefined
,
+ ROUNDING_MODE
will be used.
+
+ Throws if d
or rm
is invalid. See Errors.
+
+x = new BigNumber(9876.54321) +x.precision(6) // '9876.54' +x.sd() // 9 +x.precision(6, BigNumber.ROUND_UP) // '9876.55' +x.sd(2) // '9900' +x.precision(2, 1) // '9800' +x // '9876.54321' +y = new BigNumber(987000) +y.precision() // 3 +y.sd(true) // 6+ + + +
.shiftedBy(n) ⇒ BigNumber
+ n
: number: integer,
+ -9007199254740991
to 9007199254740991
inclusive
+
+ Returns a BigNumber whose value is the value of this BigNumber shifted by n
+ places.
+
+ The shift is of the decimal point, i.e. of powers of ten, and is to the left if n
+ is negative or to the right if n
is positive.
+
The return value is always exact and unrounded.
+
+ Throws if n
is invalid. See Errors.
+
+x = new BigNumber(1.23) +x.shiftedBy(3) // '1230' +x.shiftedBy(-3) // '0.00123'+ + + +
.sqrt() ⇒ BigNumber
+ Returns a BigNumber whose value is the square root of the value of this BigNumber,
+ rounded according to the current
+ DECIMAL_PLACES
and
+ ROUNDING_MODE
settings.
+
+ The return value will be correctly rounded, i.e. rounded as if the result was first calculated + to an infinite number of correct digits before rounding. +
++x = new BigNumber(16) +x.squareRoot() // '4' +y = new BigNumber(3) +y.sqrt() // '1.73205080756887729353'+ + + +
.toExponential([dp [, rm]]) ⇒ string
+
+ dp
: number: integer, 0
to 1e+9
inclusive
+ rm
: number: integer, 0
to 8
inclusive
+
+ Returns a string representing the value of this BigNumber in exponential notation rounded
+ using rounding mode rm
to dp
decimal places, i.e with one digit
+ before the decimal point and dp
digits after it.
+
+ If the value of this BigNumber in exponential notation has fewer than dp
fraction
+ digits, the return value will be appended with zeros accordingly.
+
+ If dp
is omitted, or is null
or undefined
, the number
+ of digits after the decimal point defaults to the minimum number of digits necessary to
+ represent the value exactly.
+ If rm
is omitted or is null
or undefined
,
+ ROUNDING_MODE
is used.
+
+ Throws if dp
or rm
is invalid. See Errors.
+
+x = 45.6 +y = new BigNumber(x) +x.toExponential() // '4.56e+1' +y.toExponential() // '4.56e+1' +x.toExponential(0) // '5e+1' +y.toExponential(0) // '5e+1' +x.toExponential(1) // '4.6e+1' +y.toExponential(1) // '4.6e+1' +y.toExponential(1, 1) // '4.5e+1' (ROUND_DOWN) +x.toExponential(3) // '4.560e+1' +y.toExponential(3) // '4.560e+1'+ + + +
.toFixed([dp [, rm]]) ⇒ string
+
+ dp
: number: integer, 0
to 1e+9
inclusive
+ rm
: number: integer, 0
to 8
inclusive
+
+ Returns a string representing the value of this BigNumber in normal (fixed-point) notation
+ rounded to dp
decimal places using rounding mode rm
.
+
+ If the value of this BigNumber in normal notation has fewer than dp
fraction
+ digits, the return value will be appended with zeros accordingly.
+
+ Unlike Number.prototype.toFixed
, which returns exponential notation if a number
+ is greater or equal to 1021
, this method will always return normal
+ notation.
+
+ If dp
is omitted or is null
or undefined
, the return
+ value will be unrounded and in normal notation. This is also unlike
+ Number.prototype.toFixed
, which returns the value to zero decimal places.
+ It is useful when fixed-point notation is required and the current
+ EXPONENTIAL_AT
setting causes
+ toString
to return exponential notation.
+ If rm
is omitted or is null
or undefined
,
+ ROUNDING_MODE
is used.
+
+ Throws if dp
or rm
is invalid. See Errors.
+
+x = 3.456 +y = new BigNumber(x) +x.toFixed() // '3' +y.toFixed() // '3.456' +y.toFixed(0) // '3' +x.toFixed(2) // '3.46' +y.toFixed(2) // '3.46' +y.toFixed(2, 1) // '3.45' (ROUND_DOWN) +x.toFixed(5) // '3.45600' +y.toFixed(5) // '3.45600'+ + + +
.toFormat([dp [, rm[, format]]]) ⇒ string
+
+ dp
: number: integer, 0
to 1e+9
inclusive
+ rm
: number: integer, 0
to 8
inclusive
+ format
: object: see FORMAT
+
+
+ Returns a string representing the value of this BigNumber in normal (fixed-point) notation
+ rounded to dp
decimal places using rounding mode rm
, and formatted
+ according to the properties of the format
object.
+
+ See FORMAT
and the examples below for the properties of the
+ format
object, their types, and their usage. A formatting object may contain
+ some or all of the recognised properties.
+
+ If dp
is omitted or is null
or undefined
, then the
+ return value is not rounded to a fixed number of decimal places.
+ If rm
is omitted or is null
or undefined
,
+ ROUNDING_MODE
is used.
+ If format
is omitted or is null
or undefined
, the
+ FORMAT
object is used.
+
+ Throws if dp
, rm
or format
is invalid. See
+ Errors.
+
+fmt = { + prefix = '', + decimalSeparator: '.', + groupSeparator: ',', + groupSize: 3, + secondaryGroupSize: 0, + fractionGroupSeparator: ' ', + fractionGroupSize: 0, + suffix = '' +} + +x = new BigNumber('123456789.123456789') + +// Set the global formatting options +BigNumber.config({ FORMAT: fmt }) + +x.toFormat() // '123,456,789.123456789' +x.toFormat(3) // '123,456,789.123' + +// If a reference to the object assigned to FORMAT has been retained, +// the format properties can be changed directly +fmt.groupSeparator = ' ' +fmt.fractionGroupSize = 5 +x.toFormat() // '123 456 789.12345 6789' + +// Alternatively, pass the formatting options as an argument +fmt = { + prefix: '=> ', + decimalSeparator: ',', + groupSeparator: '.', + groupSize: 3, + secondaryGroupSize: 2 +} + +x.toFormat() // '123 456 789.12345 6789' +x.toFormat(fmt) // '=> 12.34.56.789,123456789' +x.toFormat(2, fmt) // '=> 12.34.56.789,12' +x.toFormat(3, BigNumber.ROUND_UP, fmt) // '=> 12.34.56.789,124'+ + + +
.toFraction([maximum_denominator])
+ ⇒ [BigNumber, BigNumber]
+
+ maximum_denominator
:
+ number|string|BigNumber: integer >= 1
and <=
+ Infinity
+
+ Returns an array of two BigNumbers representing the value of this BigNumber as a simple
+ fraction with an integer numerator and an integer denominator. The denominator will be a
+ positive non-zero value less than or equal to maximum_denominator
.
+
+ If a maximum_denominator
is not specified, or is null
or
+ undefined
, the denominator will be the lowest value necessary to represent the
+ number exactly.
+
+ Throws if maximum_denominator
is invalid. See Errors.
+
+x = new BigNumber(1.75) +x.toFraction() // '7, 4' + +pi = new BigNumber('3.14159265358') +pi.toFraction() // '157079632679,50000000000' +pi.toFraction(100000) // '312689, 99532' +pi.toFraction(10000) // '355, 113' +pi.toFraction(100) // '311, 99' +pi.toFraction(10) // '22, 7' +pi.toFraction(1) // '3, 1'+ + + +
.toJSON() ⇒ string
As valueOf
.
+x = new BigNumber('177.7e+457') +y = new BigNumber(235.4325) +z = new BigNumber('0.0098074') + +// Serialize an array of three BigNumbers +str = JSON.stringify( [x, y, z] ) +// "["1.777e+459","235.4325","0.0098074"]" + +// Return an array of three BigNumbers +JSON.parse(str, function (key, val) { + return key === '' ? val : new BigNumber(val) +})+ + + +
.toNumber() ⇒ number
Returns the value of this BigNumber as a JavaScript number primitive.
++ This method is identical to using type coercion with the unary plus operator. +
++x = new BigNumber(456.789) +x.toNumber() // 456.789 ++x // 456.789 + +y = new BigNumber('45987349857634085409857349856430985') +y.toNumber() // 4.598734985763409e+34 + +z = new BigNumber(-0) +1 / z.toNumber() // -Infinity +1 / +z // -Infinity+ + + +
.toPrecision([sd [, rm]]) ⇒ string
+
+ sd
: number: integer, 1
to 1e+9
inclusive
+ rm
: number: integer, 0
to 8
inclusive
+
+ Returns a string representing the value of this BigNumber rounded to sd
+ significant digits using rounding mode rm
.
+
+ If sd
is less than the number of digits necessary to represent the integer part
+ of the value in normal (fixed-point) notation, then exponential notation is used.
+
+ If sd
is omitted, or is null
or undefined
, then the
+ return value is the same as n.toString()
.
+ If rm
is omitted or is null
or undefined
,
+ ROUNDING_MODE
is used.
+
+ Throws if sd
or rm
is invalid. See Errors.
+
+x = 45.6 +y = new BigNumber(x) +x.toPrecision() // '45.6' +y.toPrecision() // '45.6' +x.toPrecision(1) // '5e+1' +y.toPrecision(1) // '5e+1' +y.toPrecision(2, 0) // '4.6e+1' (ROUND_UP) +y.toPrecision(2, 1) // '4.5e+1' (ROUND_DOWN) +x.toPrecision(5) // '45.600' +y.toPrecision(5) // '45.600'+ + + +
.toString([base]) ⇒ string
+ base
: number: integer, 2
to ALPHABET.length
+ inclusive (see ALPHABET
).
+
+ Returns a string representing the value of this BigNumber in the specified base, or base
+ 10
if base
is omitted or is null
or
+ undefined
.
+
+ For bases above 10
, and using the default base conversion alphabet
+ (see ALPHABET
), values from 10
to
+ 35
are represented by a-z
+ (as with Number.prototype.toString
).
+
+ If a base is specified the value is rounded according to the current
+ DECIMAL_PLACES
+ and ROUNDING_MODE
settings.
+
+ If a base is not specified, and this BigNumber has a positive
+ exponent that is equal to or greater than the positive component of the
+ current EXPONENTIAL_AT
setting,
+ or a negative exponent equal to or less than the negative component of the
+ setting, then exponential notation is returned.
+
If base
is null
or undefined
it is ignored.
+ Throws if base
is invalid. See Errors.
+
+x = new BigNumber(750000) +x.toString() // '750000' +BigNumber.config({ EXPONENTIAL_AT: 5 }) +x.toString() // '7.5e+5' + +y = new BigNumber(362.875) +y.toString(2) // '101101010.111' +y.toString(9) // '442.77777777777777777778' +y.toString(32) // 'ba.s' + +BigNumber.config({ DECIMAL_PLACES: 4 }); +z = new BigNumber('1.23456789') +z.toString() // '1.23456789' +z.toString(10) // '1.2346'+ + + +
.valueOf() ⇒ string
+ As toString
, but does not accept a base argument and includes
+ the minus sign for negative zero.
+
+x = new BigNumber('-0') +x.toString() // '0' +x.valueOf() // '-0' +y = new BigNumber('1.777e+457') +y.valueOf() // '1.777e+457'+ + + +
The properties of a BigNumber instance:
+Property | +Description | +Type | +Value | +
---|---|---|---|
c | +coefficient* | +number[] |
+ Array of base 1e14 numbers |
+
e | +exponent | +number | +Integer, -1000000000 to 1000000000 inclusive |
+
s | +sign | +number | +-1 or 1 |
+
*significand
+
+ The value of any of the c
, e
and s
properties may also
+ be null
.
+
+ The above properties are best considered to be read-only. In early versions of this library it + was okay to change the exponent of a BigNumber by writing to its exponent property directly, + but this is no longer reliable as the value of the first element of the coefficient array is + now dependent on the exponent. +
++ Note that, as with JavaScript numbers, the original exponent and fractional trailing zeros are + not necessarily preserved. +
+x = new BigNumber(0.123) // '0.123' +x.toExponential() // '1.23e-1' +x.c // '1,2,3' +x.e // -1 +x.s // 1 + +y = new Number(-123.4567000e+2) // '-12345.67' +y.toExponential() // '-1.234567e+4' +z = new BigNumber('-123.4567000e+2') // '-12345.67' +z.toExponential() // '-1.234567e+4' +z.c // '1,2,3,4,5,6,7' +z.e // 4 +z.s // -1+ + + +
+ The table below shows how ±0
, NaN
and
+ ±Infinity
are stored.
+
+ | c | +e | +s | +
---|---|---|---|
±0 | +[0] |
+ 0 |
+ ±1 |
+
NaN | +null |
+ null |
+ null |
+
±Infinity | +null |
+ null |
+ ±1 |
+
+x = new Number(-0) // 0 +1 / x == -Infinity // true + +y = new BigNumber(-0) // '0' +y.c // '0' ( [0].toString() ) +y.e // 0 +y.s // -1+ + + +
The table below shows the errors that are thrown.
+
+ The errors are generic Error
objects whose message begins
+ '[BigNumber Error]'
.
+
Method | +Throws | +
---|---|
+ BigNumber + comparedTo + dividedBy + dividedToIntegerBy + isEqualTo + isGreaterThan + isGreaterThanOrEqualTo + isLessThan + isLessThanOrEqualTo + minus + modulo + plus + multipliedBy
+ |
+ Base not a primitive number | +
Base not an integer | +|
Base out of range | +|
Number primitive has more than 15 significant digits* | +|
Not a base... number* | +|
Not a number* | +|
clone |
+ Object expected | +
config |
+ Object expected | +
DECIMAL_PLACES not a primitive number |
+ |
DECIMAL_PLACES not an integer |
+ |
DECIMAL_PLACES out of range |
+ |
ROUNDING_MODE not a primitive number |
+ |
ROUNDING_MODE not an integer |
+ |
ROUNDING_MODE out of range |
+ |
EXPONENTIAL_AT not a primitive number |
+ |
EXPONENTIAL_AT not an integer |
+ |
EXPONENTIAL_AT out of range |
+ |
RANGE not a primitive number |
+ |
RANGE not an integer |
+ |
RANGE cannot be zero |
+ |
RANGE cannot be zero |
+ |
CRYPTO not true or false |
+ |
crypto unavailable |
+ |
MODULO_MODE not a primitive number |
+ |
MODULO_MODE not an integer |
+ |
MODULO_MODE out of range |
+ |
POW_PRECISION not a primitive number |
+ |
POW_PRECISION not an integer |
+ |
POW_PRECISION out of range |
+ |
FORMAT not an object |
+ |
ALPHABET invalid |
+ |
+ decimalPlaces + precision + random + shiftedBy + toExponential + toFixed + toFormat + toPrecision
+ |
+ Argument not a primitive number | +
Argument not an integer | +|
Argument out of range | +|
+ decimalPlaces + precision
+ |
+ Argument not true or false | +
exponentiatedBy |
+ Argument not an integer | +
isBigNumber |
+ Invalid BigNumber* | +
+ minimum + maximum
+ |
+ Not a number* | +
+ random
+ |
+ crypto unavailable | +
+ toFormat
+ |
+ Argument not an object | +
toFraction |
+ Argument not an integer | +
Argument out of range | +|
toString |
+ Base not a primitive number | +
Base not an integer | +|
Base out of range | +
*Only thrown if BigNumber.DEBUG
is true
.
To determine if an exception is a BigNumber Error:
++try { + // ... +} catch (e) { + if (e instanceof Error && e.message.indexOf('[BigNumber Error]') === 0) { + // ... + } +}+ + + +
+ To prevent the accidental use of a BigNumber in primitive number operations, or the
+ accidental addition of a BigNumber to a string, the valueOf
method can be safely
+ overwritten as shown below.
+
+ The valueOf
method is the same as the
+ toJSON
method, and both are the same as the
+ toString
method except they do not take a base
+ argument and they include the minus sign for negative zero.
+
+BigNumber.prototype.valueOf = function () { + throw Error('valueOf called!') +} + +x = new BigNumber(1) +x / 2 // '[BigNumber Error] valueOf called!' +x + 'abc' // '[BigNumber Error] valueOf called!' ++ + + +
+ Some arbitrary-precision libraries retain trailing fractional zeros as they can indicate the + precision of a value. This can be useful but the results of arithmetic operations can be + misleading. +
++x = new BigDecimal("1.0") +y = new BigDecimal("1.1000") +z = x.add(y) // 2.1000 + +x = new BigDecimal("1.20") +y = new BigDecimal("3.45000") +z = x.multiply(y) // 4.1400000+
+ To specify the precision of a value is to specify that the value lies + within a certain range. +
+
+ In the first example, x
has a value of 1.0
. The trailing zero shows
+ the precision of the value, implying that it is in the range 0.95
to
+ 1.05
. Similarly, the precision indicated by the trailing zeros of y
+ indicates that the value is in the range 1.09995
to 1.10005
.
+
+ If we add the two lowest values in the ranges we have, 0.95 + 1.09995 = 2.04995
,
+ and if we add the two highest values we have, 1.05 + 1.10005 = 2.15005
, so the
+ range of the result of the addition implied by the precision of its operands is
+ 2.04995
to 2.15005
.
+
+ The result given by BigDecimal of 2.1000
however, indicates that the value is in
+ the range 2.09995
to 2.10005
and therefore the precision implied by
+ its trailing zeros may be misleading.
+
+ In the second example, the true range is 4.122744
to 4.157256
yet
+ the BigDecimal answer of 4.1400000
indicates a range of 4.13999995
+ to 4.14000005
. Again, the precision implied by the trailing zeros may be
+ misleading.
+
+ This library, like binary floating point and most calculators, does not retain trailing
+ fractional zeros. Instead, the toExponential
, toFixed
and
+ toPrecision
methods enable trailing zeros to be added if and when required.
+
vtQit)ZZJ0Ei1#P$yL|X9Q}UACn$)LaW)t}avr9)%VZDj_duRH`Pwcdu) z_4V~Jm6C7>9qsoTf6~Wz()|t=g4!P04G3|p_P|0p?trGUiQO;=`yE{ZSwd8_H3^$4 z ys%ILBn}O=S|D3+ zmGAoKjxrRw?$0k>FeiT=mU(~pO3t)=cy#DX_rzjcfQW)Aaz&gMP8a%RI6~oM2%IGC zCP0`Klz$%fP965d122Lw&yMwXHIozgvQpYDFX(KwHH#l11AzpC4P3^JJVHGs@p;6r zWHmBr=+9e`KL{(3zO19oa7aSosP+an2J5>+PTjwYu)2-^l9xmv55OGn@SC3pgtLSb zaXeYiXMn6y&rQ2iy!Y!VFQQ1KGXU#*vOmXNm~T=Iswl5Ly7zVJBPlNZlKM3urkTmZ zLQUO%wyvyNSa;7+LCh-jC5NN4PgduXrP!|26(o@-(>YGoj2x-99g_Pq-8&b>Hok(i z<@f#u) *=kQY~_KZ)3^?jhO9B z`c=Df$lVAXb5vG)N{qzS#Nx )Sd4xQ zgwg0i&32lFy?78-suyLf$^&ccdl}}lJ;orU>W+}6#-&hprm`c-hY!hlbA@Enr$nC# z1O|gS8|ywW)*y*AXa}XdsisK04e!MnF-e#A F9>F?$G8U`~GZeln}8`zn%- zhVnrUPw=(89@i|y 7S|Z$H_D%m>sYkXUh- auX(k2+gFQVxB$D6>eJ__X z`U;pRVp6*|8_kv3JD(VL*J5id3xAq0?%FLU@i#1Ghn;>5 E>(%ZYLb&E>yrHExzlGlc& %*RpX8N9HTO4G?nf0n+;8R|xED`j`fRr_+98vI)o;_1gWSxCkp_voN?=%}Q7k zZEe~1>)%6>pn6XjCrxoL!e38uWXPa^j~|RuA=*Fd hsu9jk~u{esQY zyQZZ}eFbT%&ua^OI?Au0s;a6Q5#!te*kO#Y?#3UE{q%r8jFtL|`GhqrUsYoefdOyi zUmrXE;^gq~z`UB|sG;m$Fg`Ty=lc0HPnAR@ojMzTAD=JdW`T9h^iwQ>VSZqkseEl2 z0c6=83m7owW{`PfuvVr@*c~yIBf%_c$Gn09`lUT%qVeTHwn|CO%Y$*46)8c(IMDB* z4?$sUGVV(Q1!7j6H+tI>J3`9wNn)x#9j8H(Jr7qM(`#l37|0~9{(b-;1_Rkj55+`7 zkN6M^B=Pid=CYt}ra_;L{I#w*#)f7QiDfqlQ1N*}b1#XP0D=?lM{%hiY;L+}UDHgH zt^D>)5tvO!d;7DhmjVNn`cQMzNoC@f;p^%sry|k1J;l%8C>`x=ZM6p;*Fu>{m9BH= zor7cMw^dQN3Ifk_ZefmpYJ;CEZ%zlXfkgH~`r`+$3`$_1=M(2Po8Wddt8!!0b0#v* zlZ|6lslH*=DPN#Mw*-Ux&l|b)vC8q9*_U94MU|1>_?u~Ceo;7noh)p5dB;uW;@0cA zl#X _ z5c*MWAZAo*yQDUUM={>EfUM#eTb_+9uG|8nxDd5+mun~M*Lk-Uw3xO((Y^UHlc8M9 zU99KBhp3G@4p~+Ayz=Y>Qyb;}RietSHY)J$T5`8z*dSxy9mb>PT57AwUDYo6 0+G2CIV28v`R&s1!ewf*-CM%h%*)=zyE_&-crT$CN`FRT@MAa?HUC4D z{)SuHn0ypYErti5u25f8)GaAvuGpFUv@9ef 7FgWtM(B zugc+zbsVqjc-{D6XuNv0s-s)D$QTVx>Wak{nAMw-#B_(gt%DG9@E_nwoFf83U+%k9 zx$gfu5~NJ@_O4P&Uv+5Hu2Qn1Q=g|fwMHx70({*!-lNpjRz(GM*!_<8>|)tB;h`%I zZ@ nmqHJ#ESFfXtD?^>A*BE~i; zsmh@YpAEOl&@sH43 p;eCw>PtagBSUS{8e*tCN5T zX4DM%wSbp89$Oiai$MqPpirnL#5gO)`L{Y68ijLUyDR4U6CTBZ5q_HDj-T6YifU%a zj6}L?6hv|Lt(@eDy8;qwb!KUxbP}f%rGE$(*)aB#H-{$lurTG&a<*#sPL=evzkrZ4 zGc&udj(BZ&nsnzx=6#Mxya7C;(6twC0nAp1i}|cpu2DFXYWFZ!DFWF4aHYKd^yCoy z0|5;k0{=}LEBA9z^YRwt5AgIBB PRJr|Ix-= zy1(DwpXZ9rfNJT@rM-G6s>LHB#JBR8O!}D8Civx!SaXWJ%XI6X45i~??_ZF$o=$br zP_e}*2EP!u9;6{&U;lQHEk?pj!76pn;Cbk6|1t9Fg~xpS=Dvq{OW~T#0oXQzyIzoF zv;muw(X u~L`kblX3WZtg8kUZ+FM3g5n6=V7HXs#bSEmh)P z^dZQf4nFH0UK=0h)c@{i<7GeVF%`d7yPMgX`6PI>TVd$$Dc7m-(n52prGW;be&omQ z DgnH4t>c_7xkz%vUUp$^!C_rDFTqppeCJ=PI z8a|@W4Gj%pFqF@&kHx;5ZM@%v$o^|u5o_$evq{!~#^(ly|Iznyw@v)34!cakLK7eS zG9iBG|ICrqUOuoay`SgI; XMUv28qOqJX1aAukFMK->awo{rv zf0(d9YP{C%U+3C23*b>JV&5ENMGJ@?kenhjWWT$WK?ivbWpGrDvsAD#*^Q{p&bwk1 z5v=Jr#qdz@7AoQNhZm_A5hin<7vY#MjVi2rWUh0PfE&uJEZ5{q#ss-bV#-Cy(x|UB z>jqJvOc_PP#0dEVn?v#n@T#q?og5d2;g~G^gO#7&$rfI%R^>o0Kg{fsXvn6&uyY6m z)Pk~rJv>POC1@!;;zj_TPT+IP`%6^QMXa*@K2x6kK%g!&U+M|_c6=_5G?wnIzSgt6 z&Azg@NUUts38#O}`)Ngd=?}`?7HEwcI3B*{ z386PiI1$C89ArFPOx~$`uNBE}Z*J6MDTTLAC=0P|dYHAk!&SSYT5`K!QLz8G_mc2k zgu4aRcD1Tw?an}28hZ{s=_DY^{{^}LfU5@UPs9mXukp#^tIZ(CF
O6P#o4}h% zG1lW|RUMAywMe a0=HE(6 zwC~IB^y$zl9R1jn;^RpfxFh9)rcIa0Ms?rOOP_tk(d}<~*l6#D#YKxM^;8^Y88L%X z;PC1!V8D>Aq(X%Km}lspN3ShX1^u18`f025kN>vY9;^Oya1D#(z}X#%6qyrh!mJWJ zhNDZd1Cajc=qvw%0>A?Ra{PLv!g ez)Il{p3 zuvgBO_PoUrUD^#*0(kklFz7^~CSMH87kwK_gZR1?4V2qjXE3cA#@_3{u6#t60X`RM z-Ixz%1=$Y;-@Iq)IdSRX1U7uH3Rn)kGTz3tlW%W+M>V&iR2&5l-H$?A`Pc!ANq5>c z?Bltad!b>)59EE^R$8FS0{fzWZmUktWi&C2w+nk<8 ?d|RI&lxsM#?@gXfc?9YiSd3+IQ;wbXRAWu7>~Z^a&ZfwKNj4NxDbHL zcX@~dOtfuv *keWKygzBXei*G9k<_6P2*zHA)w9%H81 zTOfb8|K TfH#8 DHUPzh%6)ZN3H_wZ>vUyE-zVdcU%3R2VRaVEn3AW_pT0%3)zz+QC?_D4gT2g!|A9 z)so-mR=x>e(KviTj5Q%uIA`{>JvqvK`0bN%VEoQ-vn0=K?!(_40uA&AQ%iMN=rqaLL?h)E+_#xNs%wd6KqH%zEqW6-{xH zjBXaj%P%1A?I^imj!P7DgRX(S>yA#wDHV01u=baW7W8WfqRaQ}$~fF>F?XJa+Lh$3 z>IE5JZUnHLqnqr%9{^5gfM)J)b!xA)yw{&2VEN6@gbmpgPIvm)Ax6qGNNwNX(7Ku| zY-2CK+m|il&Mr08%?tl-B{uR^cp+lXn=@CHBe8_Xq?!D4TAbgChfdReXMxR27&?DW z_;!JwqHH53*0sHtblRD&pa6#-9&L4ZUr8ydJ6HtbkjJJLmXFndPwrcRo6LFk5SYLl z2hK0p@zY7ri3>@~^__i&4PJjb){+##SF0+9&JKtN`TITc{wZNU^Z ?k{nOEqmRhR%&7fn4l2TWQf79Elw1tJ*Q?nG*%a`E%bT&C<;`#ds zipW%6cjojlipm;M$&35h+5drNfGVEYf44Xh{|9OVX8FH5{s-pyZ(QepIye#Geeu`% z`Es9~Rf4D~&g*+p^XJSwx$oZj-nI4GBUcLD3FkP@(S{dB8f7^ptqTpb)_8HpuJN53 zQ_CnfHFt+bPB5%L^-|N!uV_%mB?n`9fgV>u5lYd$dB7frW4@?}!nbS^Y1NB%LyO3r zF2v0ViFAvssZ{o2*`EqdzPmRxe#5tY m>UR5v+D)b$Jp>UH)lqfo2uY!L;F@Dmx9 z4?#}Mt1?CP52tk;LP9OGU40g$(#l(j2N1ERmpXsZEIB?HjNwhs{*rddvA#h#VlAbG zL02n+U1Kiqr#rzSA$n^|M3?LKXN(f7sDW##!`!3Vpe7H3z6n_(Ev@*YsNSJ2F+Tw- zBpBaedJjQU&*3AA5Q&;^=h~uZ{Klj~JN-%x=EJsLG~lV9G(R)vHcBCxa?0MYAQ^=V z Dzwn zNW14yKJ@?US$))*ZciBRagg)5p6dS>Q?LIS44Wllm5X>B0gwSoSO_z@EFX>g?oWT) zW-@qIF~KZK#fNyZBpgYYbr-w*75}9LjLMFg?!C6Q_0;ofHda-eJKe_sz6;$C_ F=G*;UN*-N9Z zJZvz2;?gU()0||^2PzWVIli1`o;Z%>?N(!(x-zf8^S+3DmW5ziia9XQ6MoU4Atk9I z;bLQS#;BkG^S8$jBOT5w(C<)|!8>T-TkDx(?w?HDTLIUz8|0LH8(igGrbz|Qe%r&d zB-Y|Va5qJ6PJ`5)1rPe(OIdg8F6_Psal|d&!*W_gNLS+;V?eu}@c4+Fl{t*c@99u3 zQxquk?KS$B8zh~?5WXg%ZDEmM>?JM&B9fv7BvfgLy(dATp+s?L%~U1bc3}%c+(s z8m}3J``JiHY3Hd|_|U6&9=27GGMrdh#RRt^33wN=_cP@8WQTN#^g*OF)>R8Hw)r9I zowaBlvK%xYJ16FVQC<&B-VEN7{;~78!wp)>2zT{!U`aV~*-(dU(t=`VPYcbvhsi_RP9}5E1&(wmoA0+=kA6Hga>$8io77 zg;?#DY^kc?9LiB(Z{Sat<=qNT?R4U+=VR`prBtH%cArv}xXiEdZFZ
r>n4aR=%9+`Zf z9$UNp>Q}03ARU})+ DHo#H qz&Y5X-Gq5TQ=+K ztx?Zwln@k2t!)hqTRunsVII}Z(Ez_%(nM=AELefy?E{1~ WTyY0Rl z6zv5s#U09V0C4eW3@Zf1J-QXFIUIp)S~bDDMgM$Bv2YTVFdH~&2d82oO@gW6=<4r4 zsOt*+vk7meL#~FsdU>nbMp2VW0$wWn`Iwl6_jb*V=sIr~BOauhQ>MtvWQhzg(^Rj5 zcqiB O4Cleny+v@6CWY;OT9&-f?#AS@Lp#x%G%%b&EG$J`b36$1DmMQ`4^lj ztqA9`aT%_8KTt^Qtrh`_grScSGF&!&9k((;jCrrcSAs8Aj!VF@9b3k&ezCs-nJ9F) zn(0LkgJJsY4Tiy3ZXr*p2&@|SkKgZH4!)y$&u#Qk-Gzl=jqUE`OM&z^w9t5O1!Y;j zyxqFKSF#KqkBn z7te12(>43}rG9`eF~(~NV#_(6D8#0`gn{?-V_D~7v`7%BkhTMhbEM7RU* zSX7c^i~{X^*oP9og$q$XGk~9tS}#;^hVk1R3Jx@1tBV57h%(Ykr3AkJl0t=lD3|^- zk|X|`fGVxh65Vi)#t5ON6m;CuV=3AH{Pu0X<=`7Rx7Z$_@mDL=3iaKx*JQXPWwpAN zs=_WWiR+JDHqt}FP{IeDvrff0gdg*^z}Qp=fg~{R3|er$$2~A0E#xdbu+{Op^!P@X zHyY1A+Z7T5Xk}OdzZ~D=!1QKW;YXh6a-Atrc&XgY6{*(7NRESDS$HUW<#6bucb{Aw zN_SsiBMc|kSsL{*tM2=H-mG9_hlyO0_5K?AIB~B6in?jgVZT-O9D*8Ew|9O_tKb~i z@6&z@;8mqz2eS@d&!w0K K$?X>TuZ+U^5A Pq(epx&IpNA87e+ zBLCAm0}?~K$7+$|K3n)X*|U(#_mJ#daqb`92oGchlUN*UHpY-^$9Fpc#E4~(Bsua9 z3n1C=uuo~w& Em|j?qKur zh?Lh>{4w?ILIB>ps7VCC3B>c=-Q98=uF$Y_b|%4$Vc{$+Iv0(r&ax+)+c#U!$2#&G zpNj-tO~lF_E|+S`Zah;`3QS}N*(XK~4Ge&Q=~}0G@u(8?^^9M I^oOWYa=)nH*w#_!~%zb%Iho5 zfvP%ZQ?VaU +1iRCwC z& HUgx2a_9{i96pqmixA~faqr$16LE<=C<|Nf9g z1SLjHhPy&HVnBv3u`2pd8%^!P3=h53^)>(`MPP8Ly3{V6(G-7iMdc9>qM=jP?=68r zAc^{miymdH%~Jc@tyz6_UAyRVrbGQ_h3Jn_Yx9r(nhW*R%b~y91V?@U5ZuSs_eQ!3 zS8Rfe$3DETr<9T)t&V#6N^KXWue8Md8n!v};N_$}nB|Qs@!1`x>DDMB(a7>6nM^LT z8?4)(MK$jMQTQ}+$ELCLxm>Adg0|cucOSzSFiQM~wmAb@{Y#S`u|XMI>4N@=>qO;! zvV5BBt8@R^L5#ywcC~hN|2936MuzFct|TQ^xA~D{Tl8-SBX{mGZC-fkDw?A-IqM}$ z6zJV!y@*1ydcTvS{i6C4Zv%q_-?Fr{G_S2$xvfsIG<4Xa*3} *PN@@4U@DeXA57P{(h1D ze-lm{2Xcj&AH4y0LQ;$(@7PtlU3Y5Lp3PG|PU;8Pu=J<8i~bhJCbm%kB}BH=W6iXn z{0@EAnI_O_%D%2qHqGbJpLJ47gTV4H!7^1y_u-*5IV^4!KWaV>L_C|x*Td8~_Uga+ ztSbddEx(hh!{S+X@4d83a$ {5w@XR%8@hD2dNIUEffgVrR>9X=~PoU zT8$=nF9!eZ$mbdMeM~g%$@0meK?h-famIlt(0FHKV`N3A6u~M=BImL=CxZAkP>t^% z{F%0JAjIZ?shPnR(dpbuJ7|+;A(y Z$oTl{uVo7etO`f1*C0N35=}=90x} z{#{TL_Ur+Htp&Q{0blE~+l_w-*lqshD9N_`p_9XfXc8;;^56LWQpzj@T(&9vvEl_y z+n*biaM|XZX^lJm0Lv7}UpWzh*OiHv#o3!DsDHBWiIe!T)+}HC@fd;Zm&AEP^HiBc zIB4($eB%GVkGk-WcLVTj6wnB}7F;#W(P{$Haet;xGCd>clb+c~*Tm)j@@y`g2#=M+ zQKf2*;~6rn@bDySX?KM6|MXicRYa5s+1P%;*2}K@yP19M1aYOls*v2g <^US?-I-&0)2G=V0lapD(O(l7 xCB=~LuB0+V|DoXWS6T_CGe8cFg3@Tw+C4(^~HlRT>qhe-WNrPi;F89^h5w9 zyW5U=-@o5ju(Y%k0RZyl@U_)?V)nK1kts7{17xPQ+Tyq8m-RV9F(?&FFwEC5 m0DG zwPR_i_b?)cUgN-}Sh=Yogn{&a39#>HQO(s)SpN9grXel@ZY_Sv*70cm&*MV^?NYW$ z`Bs)Bfgzq3_Ay(&-@$<3&Ahf*bNfGBruX*{S>-1F$2+E9@Ub|%^3&YoMXy7`Z#GrG zy8U#nz<0}TAz0-lAxmqQx1cg8%wBoL;5nnKS;$%RK|ukOG9t>pg gy|a HBw(Pkcl z2od>X%l!%3wH&{{+TGlTwxhnI7*$@g`a>&PUrFjRmsmbkc&7L5NKm`(-}4uk> }?tY(5g z%Ir#o9_+L$6Z?vWggd?X&xpX50!{(vrc1HZa*v-+A>1TJD~@pyw3?0;eKz?3%faO? z!h`LAZ48L9ECnbSnV!&~3l1hh8Rq0cy^jLVJ;vUykj+eVTz`v`6dj{Ds!q=pKN_R( zi^pYUW$i2tb_0wpH2MwTIz@wS(wXbu4^cM1)UNw+b8~Z!^<~K$wZG(pojB{DF2wfU zO~FInIa(1(VfoqoUNy>rOSm5gtwqg `B&)iR&yL=N`#RXs&md+^M*JfpGZ-7>-;i8#IE!M$0+%J&$(=`yB^>I@!9S7H0dB zE04OR)-Qk#T_KU5(BCLcUa@{b#I~rTc^45GKD?36#omj^9PO&&wjb$whek7oE7@-Y zc{Z8rSo81n-oKNxne(_izeVt_2_fsGa=wNv;5Pno+w7I;#n!zF6P+#_R}SLV8xKL= zJMPFrfWQ}-K;YRn?@WAX=C?mnXi}Y=oGfBe_2wC|@k1j0XY;6+zslaXk^A}-RKzhQ z?#e|V8$Gu2Y(K7u?LLgKn&Xy{sns)La(AjfxkIeM?~||d!4oBvl-;T9*36ya$92CL z^=!K`O}fo{7otGj{h2vnn7Ut#Fx+*7GT}n%_F7uL)yp=FcXM=2Bw$DZeROkk>+kF9 zOqDTc9R@I#FNzw^gAJqj7(UYzI1$N>?ce5m#nZ|fy>6(6L60+EJA#)f(;~5LAPd$N zz>_sfzUx*vty%rb{R+)B6_+-sQJY8{{6nr5Rg~ErDT$0vD&15?2fxiO8T )-WdDpf`61v|M~Nz2Y|U(oP|}@cLW~~h$+u!U)B4M$Sg&EQEx}4~yMfB0 zJ&Rv>vMmgoyMMi0Ai4PC2aa)m72+)^o2r_o&u-6XAy(>`T)Bcz7ofzU``yXu^hl%8 z4w!4v^fPFH{e44s5VAirzN7g2_f{9Ep-4^N`*%Pg{64*zS@ufa^?N|1_w!Xe4xsP= z5lCi6Mn-1l)aFdbEF&Ou%99@BzPrQL=@@`*8@ko1m|?H1ti;OE)y|VoYi@U(yb_S6 zz0ThRMp?sq6NFd07*5nbuct=qGV4`N5|W{$SZFCk?NhhUNS1I(=St9r-F##$NOaUw zhtgQe7#`*OeEazu@!w~)-v^196#z!>NDxhzc3T8k31<{Nu}}9|9cJ3&%zHMbS`a5u zU~#kg&& ar~l6RqUu03NR?dDqH^9s1XG#4UG zjP-QkU-lN5?~Q%COBa?vgDM4J@#kN&G>h)3sJr;q##&cN2{Im46*R-rn!zZ!MFtPg z2bM*~G-0}4_UvsJxvsH?;eU=L<1_eyq(mw FtBPSrNKR)| zt9lwja4##eYyKrMIYw;z9Cnn)pOLy{lLYU602o2x(!{%AJ(;Ss9P%T3lzcn@Aoy63 z8GLy!!+U#|<@6v5s&JxnJl~ZT?n&BUcvUPNB;PryKaHd*$B-Ml0IL6@xrlh?z{98L z5cD%5hu34!1&lZf$B(MU8s;|iLmGGx{8%=K29awpG3)%;LxR3`Y}&ep0Ab*d;puGn zcnGq$qaYRh0q-u(Gj#W9`a}ekB1d;OSHvBC$J-?4mn?*M_D%=ORY0dNbiYe6hzNQA zYfrXxCs{muZf9qgXZ>Y=?Dd=VKekz(e|7l7Pncbi@NWKe Fbis|f$A3V^4Zet zWZ7B}RyefT734Ld;T?DQ6>Yi0_(bupGvd<~tCI)!5%?aD^96#7k{-?COso87QWnqs zA
X}h0H zqz0nZyNPHbR%(_zgVz%fHtie?9xZh%M5m2`3Yvvn#@z?@R2-yXpjw2Bmk~(soUDn_ zsZdRnb&CZGw6EUF3ZKg$p&J{&X{)IMBu6oMQTt<6R5>?5_g_&ue~5{|7We`)PCrcu z$YQ>?J|MH^Z!BpDMN_}Oi>P*ADG7Rf@r;wyp9vT&2d-H)U!O^^+B7S?1BZpC%a7)G z>z;fWI$^2B!a0@?qJIg|WXf$2Zo^9jH3W7r!}h&A`^md1+IQ|4ONhgDy1iN9p{8Qw zt(n?2M|_m)F20;~3pp$9Amt-c?1ah&qqh1}`n )y_ zEfN;Z @E0^IdG-k{dD3@LYC#)SS=)8Xdi(6nj(S>%zX87*nMp~y7gI8 z`v?5GGHknZXp=` ud*ZJy|_tec3ub1Kumo_Pt9ia2^%ie47q$}1HM3^etlC3r?qj3g# zUCYwL@fGJQV=LO{TlmYK9j%kB?xoYCP;{H(ha67PpdBa3puS7?uc=G3$MW `yr{kf#I3Abq=$j9?5MUH73HwoyH8k%Vbnx2qJCp@<_i`Nw-k0 z z4V~YLsppA{qb=K_V1CBCf~GHub2~SA&4+VD1@lT)l1rj3A@Q=9sdqsA>#}el?)fE= z2NY=GR0L5M9+Sd(E5qf*ePwnYtmnXga{;E~R*a?#eZuvM7&Kj@K)Xj3s|iZ9S4ie9 zqWu1_{pxr}@XGmK=OzzAq}SWlgeA&z+!`|(hyk6 z+3hi9^frs8W#d{U^f0ZQ-m+CqX_~79m85GwFI~O?=-x9FE=3(R!Mn+UufrO$L{}bB z(h_F3tqK3{D1X7Q0}=qDgGBo?+tg5Q0pdzIdJ#MV2-`BuATtC$<-q3fzb5rxmq+8k ztnI|B9mTzh@58^nz2i2LD@>k?O}~hN+U`59W!*icL?~z1IPVCWkKKI}-*@imS^4xl zH$uv$HwzB8G>lb8fjan@l8dAO?rmcFhkJ
d=IGoFF8 zg!q=1K?=QPum4lEJ Krmj_T$`-s8^B&TgK52z*h7_-HHS5ip;h zj0E@Y+$+~1uBRilwoKVqj<^w*F8RyYI(oV<)Ly!KS1i7eeW!IvoM5Xpb4?AkPv6_d zHC|#r@%Kpe+BLu2Q7{ii_>GAcH_P|rHyUkiuk}K^)F2HDcaS+kz>dSeRB$@btTJ)c z U~{xGmi@1BEUs;Vsm1u!HMS?fR3VbKw`*yC^NJZFYKJoHys5~YUFof+4< zvXxo{l$5}Fd<%ZTUk!DKsZ xl|lSj!Po3x$2x z mHw znI^j^DoZtEAECvTl9a8YzWbcvYkQyfdEW2)^Zoe#n3;3#bD#UV?(4elYsZg|JHPgA z=60gWiOh=*4;^f+IcP^t$N_Ut)dZ_(#(86Gk0nj$ps{m3RLb`{Cd0km+9N2P)_B)` z+s?s1PUry}oJ86_1mC!WQ)u1kv@gHNsDLxWTC*il({Hzx-I3;=WV`kH3kX%dyp1bc zKc1vFbNyD5 IaKQG!0kOIB5)x#^6BpG} z?D2OIUZ&3$Nt&6SR#a3JnNIZ}<1W5!2|SVz1gq(WA}JVvpc4(LX{+r{&t0!Aa}}*) z3QZ^9dmdcww1UA$23{!x)2Oo#w&Fp$+*uo1^%~;3^OH}?66Um>J@<0jNHT=U5Tx*8 zemBsUA)W~gzAh^EbyA3~A}R&`UPgqyHOB7V9bQG^D5(+hDsZdCcogxJTUd*J+Gpo} z%Gcd7pfVsKa{UAj$^SqEj({AlJqRyN^(PhC3B!(sWoid53&B^+ltagT&jR!z4mMR| ze1BiH5!M;we^rkB+z3lZ_e08w!$>$4|F=EB5V~fTtrj#r26CUZxD4plA)i)gmhY ^Oy*HV|VDU3G=W;z1#9 z0u*0@!4KJSeYf4y?KIWgI<9v+1h@UEC@1LBHckQM5=D0FD$kQD3~B4S9ZGv`MW~$P zXD+{9L)$Vb;2>sz;w0AuFf>SWEOw{~`u25EN=gd&)eI`>xzszQq&NzX3M)UVGvmj# z?8SYQ9g2K`rHoVd`QFLm-hv|Ks5MO^Sqdo)f}YeEI!C*ZaSC66%MIbzP$TR(OcT0# zbc5C5ZN=ISBH|fSjRj*dLoLz6OeQBZKUH KfEs5u5qO` z#i;LA6i-jxb+Ndb5=+{xkvH#}M{Q?#Bm}Lz&HeRk;wvXEGcLMhK_w%q;j8deZ&3ao z2$-c~LV(sOAkX{Gf@ifCQk|GcUQLi{gkYYvvKNa|@y422eO%dl4D9Q_`Vp_UZ%HVS zH;(Vn;>Mr!g&y#oAVCKw3T7pm`NcnZt0PDmG{Ih9*`Zy)X2l`(77pe~ 8X9xxc*|SX?@tm`mEaX6d+I*a3rQ@}ZtP z{trq1qKU%lo>Z4FB{k04AE=xM<=Cd9CE(0f%phg*GSuWkUP%8qO7cF2ivh@1+pr{T z<}GMcYJPEZU(~i)L9OxrSJr8wHfj1dNI>dFz90s5 wtbCphC57CoN9Ed7fDB?n6($ zMShcgqxJ0#PHXcvz_t2UZAryA^-;zJ5g2-~Y4f?S*R1$zaz5>+?cvi$=md%gw$?ms zoB3t*oz*=R&F8uxLc+d ad#~H!h?385TJ^Bw8oJ7t3KD07An@K8mxb> zK2MNhOOAFhP4?$D?IE=6p(vOVZ#*e51WhzRKZtwj57Kx$^S)KTd|a0~H}@^H>kv eNlT5>KbIYPpcSSZu=htjh+dVF2}FMRofrl9D__U=9Vr $*XL!4k zwsttR0532!Ml@BDx1vSIFdx*5qMu=WIEBSMvruq!T1p?uF62hRo&v9A&4SvZqGtYe zr6rqlVmPc`Sg4Ty=q6(NE(7Oz9w~#%CS*Gu_97#^6OKO)763x%Gee|vk8Y_1PBZRg zphGl?MH=T@$(pUP2GwbSE=hOWBcoYBIlTGCidNr}0t@53o@m<5OVT5?h=c#75%y09 z=LqC5uOqPplyE2+JyC&OPNkZE5QGz@aP5j&9mVWLz|KQYQSHw}(|tBJqm&*-s=67r zs5c`|Pt_RgBnE3iO v+Ue(>PsJpdxxG2-hB>pW}xH z2I#o>MooLE0>{tn_c0N|Y46{G+g}H|^|Ux5{&Q5t*9OtKv_Z{vs4ooAe{uk>y{Tda zdK86iHR09vBz|W&BuBzTfa es~(&+=3RLEqc;p@o7Y9XMAgr`80 zO)eqT@a+QIP*_6%=1ztNK^K(*LtWa)Mt4+XBX&(o3F(vcQ$+6)fHP8{K>x942I+P+ zq|S7XAUAHHi#`F>ibQGHTU~018oQM!^(_3%I3knb%Y}vRAj;j}-#@EQ4_;X^65}wu z1ZkLGErRxDw_iAU>zcu7s>|DKuQO+m!&I7BoS#2psP!4tDkZ&yL8Y}&O;M3#9#wQ} zoC n9R?l$JG7jn6Gh{*Aqjj;SE$3<~ Auy(Aq0?q1 zqCQm6BT!T}GyyN{p&*P)flhUsZ!^M{Ph}6DLv)Pyk)(_Pe-I}KmLrGnA%S)gHn!FV z*8u`Zq}Ma8S|C9I(%Oj}kI&h0yzi|gGQ~k^8ny #k1>mDJKNk(=x zGzr>$@L)C<&_dnukn>o=r7Zo(m2x_sGc$k=^O4h+okje~IYZ6vrqTNe0dr!AZ7EI# zsdq>cmu*0skY`5 @5Hq5uyjg zMg)kAB* `}(1vGy!D+pkA9_y(cjB-&XHR U)6=O!I_Ezf6PT{X5m!A*3p5M;^vMIalGZKd|w}kJv z4ri0!nfSie9m%1y7FgOaj$pd(Y6SIQaZzpUz_z*S>Mt%Oi<{ShEENXE4ALWY)f1k1 zEgom6(Bi;Qjf506&6qKfJZ*v()bJq~v#0n9ape&DPa&~e#6%$j6=KcC7+14^8+&(Z zp(hJ0YmCJttY2@mPTeN9j<=L%yF)|plwr2=9eJHpC@`kfOaGY}y{lVdKL#(_!6{dH z890#<)$WrC?OaCSf(i!TSeu_9yNFqPqQV&4(*wGweRauDwqf~Vdqn!B3*~56F)OYm ziL_RU**#+?oaEwY*5%AMac`sZX~ez)mA?A4t?u%mnOWt-O3G8x(Jxn4JNwx^e;c@) z<^ysz-sM`D-njiOyeYWh4QG1BLDum%g$?4Ww}nx-TFS;Lu2uy5HLvYxinJZu#g($t zg7(eefe0oP?{dR7k5yU}U#EpDis)pjwI8pG*t(7lUH-7M;p+XxU!|wU&4C-}xdV8B zC`HvLl{c%&
U9n|rII&Kvc78MqCrFWU!;yU2n?i^Y)Qpv#TXk zgF1?&3D&Cg#^EUgM+GPEsaLM5!QPuE`Tqb$#)sk{OP(TKcA1M7Qo6ok#z(oQoGZJU zwni=-j~kI2G9;@D4Y8n_O ~sVZ)hJUp}pOOv#zI(_Q`7`EOCSLTXueD1OR zCXsbRDsJ}bp0X8NHd9^plMkEVC+z1;%#hOq0HCS~_@Nq; g!CmOgSfj@^fIj{OkLNxuXni$_aeh{{oF0>iCw5|R=U)(y8QCJ%h9 zR7vU6kGzl9?!J!hro~0bS1kgAf41e3?~JSB=ga5y6Up^EU~`VL+cAna(_IC+ryiWi zCARfw4i2#cp}wV>$|;__I_(ms=#mwoxV-#niCcaxM>??9O=zwD?rvwH$QvMQ|Gpu2 zI_TYnGXd3{S(@beqO6{0y;biX62-B7Z7F$e+3|QL oIyShna$XovSeZFNbR>UHVGXV&qeWadbl&&=Za^XeJygiOt7vZU zbe&Y}B{5*FmO%b*ZB@M=XQ`U?l~!D$Se3NqyZYSoiF6sl^gU05=9pXX*^OW9p^%4H zIQUU=C5pj1lye!}?M^R2kt4Rkhd6Izw)suKMX2mr7Tb F)6r%YH)S~)9VmLpZ3<-y!WLm|9Ei}iA5gQQbxB? z$gNJ(s$%Q%PU!7p14*5zR6-MbmRWC!8<2iyNk$0!2yCJH_b7}C8XjL(y1*WyTnhZc zV9@~d<&Q8D5g*^u-x-;Czb;E3=xkuKKZ+l Y$F0`sma9g__Iwb$!V&rr{T|R?w!|! zIE_G>bPFP48HR3>h%ezg@t>MqpQbS-AJuP_N@klW|NL3rB=~k>0|ysZQ*wiZ!Dy?2 zCw+VcY5ORA?Xln2`Ob(7%C2RRO&;PD4BmV#58N(lbDq;s7hVnM698K;0ylKJJkAoY zo&ZG6U-w~jJkR(n`Bp){&{4mGx(|lmeQD{g*0`otLW(%neDxbfs%vP>?qUCCIR#~% z9Uvcwf#L8|3|^KDs_xf17nYRFewEUtw1)S(l&FjC64GDzGSFcE>JS$$=KkYz-kmla zyo@f4T}4R{oW9CgVkY@D+VU>(2{kRNbnQEtL%we=-E8e0*EM~4ND%I>UL;av9KCd_ zE|TojLz+wPj9J`xlo{H1ono#Wjbf&bv>o=~ORtK%oSE#Paq1%G SDZuAG z&E@Iop2UDd-#RMH@-|_orcHe=neJf@4-PcDE%&U1Qrq@oaq4q@x8m8--Vmt;(=ycq zMKJFGa@H{nfqjU6D(|d)khsB8<(ZP#>54m7`maMA?F|FT-xSi~nWB?$JN1=nOc4JW z! B=(6@R97aG;<(KtHAsD<0`Xh^T+4v5$WIdUZtEEH?1#U14RF zQ}- DEKIH)CTxm45DCUS3ox zXYXU?I}ga**@RCJSw>54QEd2Fra1_gf~{sZBIQXkL@A~94| zQMXKLolU$OX9h@3M`2R|J*)aa4B=d xp5vCQ@dzBAX|b64ID>eva>y|iKV z;_v{lkoh|E g=VIU(C&(Tg-XRaQ%({H(;>-Z<`(H> z6^=ZbCu5~b<^m-75+p(+B#{qFo$LL8z(pI0As?t>0w@e@`M -KqZEC`4(S9n~bV^Gzc^20;4Q<4}EWScV5eC~d|CBc;rR^hDcj9LBgL#zUc8kD# ze0 BR0nBJWL;!Sp;CovrIE%&jfJF&I%S93a=pEKu*@~`IW~>L2;89ZYy+Q~ zV(7v=kSKw3P QEx~jjFwzq5aGQaaG=!0n5nOwI4d{9S8sxAIh`u!?L`?@!IXB$mzID`GQFuPT zRQ6GC%9y>5RS^o{YC9U+3?z62v=8z0@YviAI X(C7pWZ3d;*r^SpaF5qjaKaP0Bs0e{fIs+?-=;IIog?3D)soI9?Y z`;I=&1_?!={{oFh12x-R%2ZK5?Wc@ggu7TrJ1a3sn*&=jc1m{mJ6sOhjEWNxs%R`s zxvJmL1K8|UiN~}K>wq=r7eX=IcAHF|otaTmR%Uh%p6frUNy6>#Xf2*|wJMdBui$M6 zyKQsEMT`}d5Fhr_*yPD8-Xv~A+G&7>B#|J4$LT(kqlZ%$cG6t`{ ER}7Y!DUTiQbZkYU<41?oBMd`$h%6z{HOVvOsaT>g1#u=r#a~JkGs^{f$jb z8r8gsQh*g{r $;2&J-URtlT=kRY+cQV1 ev8A@?@C*GBvDu(7 zODL^9n&{xHWo^xwyhsU`^v=B|fB(}{@$>1cwMpTws~9MZS6LYJc%vZtA68g^#(>`W z>Gtv%^!E2L^ryd1!3sw~6vi;uRTM^st1NoF^gmG$E6gB3(*~jr`STaIm&c&De;9*4 z{e6lsS6$MD9~b-YRs&%9@%H(D4zKBti~V=20igbL8vy-%vHu=kfYk4(L$~1jVt>N^ zFPkH{v_rpR|2KHq;eWWAUpHrY1AoK*Z}8$>SN*Wq?*O5&d VR?(ZCG$4gF)M*8|TUlxwR8>cDnawd1p%bqK#fbr5OWwR2v?Q&Fg60z_ z MhpLpK literal 0 HcmV?d00001 -- Gitee